有道雲排版好一點:https://note.youdao.com/ynoteshare1/index.html?id=c71c2939061bcd6d6bb156dcfbb1ba57&type=note
注意:ES的索引只的是INDEX,類似mysql的database,而不是mysql的索引key
1.創建刪除
索引可以被添加時自動創建,也可以手動創建。也可以使用delete指令刪除
2.索引設置
最重要的兩個參數:主分片和複製分片設置
PUT /my_temp_index { "settings": { "number_of_shards": 1, "number_of_replicas": 0 } }
動態設置複製分片
PUT /my_temp_index/_settings { "number_of_replicas": 1 }
3.配置分析器
分析器也是比較重要的設置,默認standard對西方語系支持不錯,但是不適合中文
在下面的例子中,我們創建了一個新的分析器,叫做 es_std ,並使用預定義的西班牙語停用詞
PUT /spanish_docs { "settings": { "analysis": { "analyzer": { "es_std": { "type": "standard", "stopwords": "_spanish_" } } } } }
4.自定義分析器
分析器 是三個順序執行的組件的結合(字符過濾器,分詞器,標記過濾器)。實際工程中,不僅針對中文要選擇好分析器,也要針對自己的場景
字符過濾器
字符過濾器是讓字符串在被分詞前變得更加“整潔”。例如,如果我們的文本是 HTML 格
式,它可能會包含一些我們不想被索引的 HTML 標籤,諸如 <p> 或 <div> 。
我們可以使用 html_strip 字符過濾器 來刪除所有的 HTML 標籤,並且將 HTML 實體轉
換成對應的 Unicode 字符,比如將 Á 轉成 Á 。
一個分析器可能包含零到多個字符過濾器。
分詞器
一個分析器 必須 包含一個分詞器。分詞器將字符串分割成單獨的詞(terms)或標記
(tokens)。 standard 分析器使用 standard 分詞器將字符串分割成單獨的字詞,刪除
大部分標點符號,但是現存的其他分詞器會有不同的行爲特徵。
例如, keyword 分詞器輸出和它接收到的相同的字符串,不做任何分詞處理。
[ whitespace 分詞器]只通過空格來分割文本。[ pattern 分詞器]可以通過正則表達式來
分割文本。
標記過濾器
分詞結果的 標記流 會根據各自的情況,傳遞給特定的標記過濾器。
標記過濾器可能修改,添加或刪除標記。我們已經提過 lowercase 和 stop 標記過濾
器,但是 Elasticsearch 中有更多的選擇。 stemmer 標記過濾器將單詞轉化爲他們的根
形態(root form)。 ascii_folding 標記過濾器會刪除變音符號,比如從 très 轉爲
tres 。 ngram 和 edge_ngram 可以讓標記更適合特殊匹配情況或自動完成。
5.創建自定義分析器
與索引設置一樣,我們預先配置好 es_std 分析器,我們可以再 analysis 字段下配置字符過濾器,分詞器和標記過濾器。
作爲例子,我們來配置一個這樣的分析器:
1. 用 html_strip 字符過濾器去除所有的 HTML 標籤
2. 將 & 替換成 and ,使用一個自定義的 mapping 字符過濾器
"char_filter": {//字符過濾器 "&_to_and": { "type": "mapping", "mappings": ["&=> and "] } }
1. 使用 standard 分詞器分割單詞
2. 使用 lowercase 標記過濾器將詞轉爲小寫
3. 用 stop 標記過濾器去除一些自定義停用詞。
"filter": {//標記過濾器 "my_stopwords": { "type": "stop", "stopwords": ["the", "a"] } }
合併
PUT /my_index { "settings": { "analysis": { "char_filter": {//字符過濾器 "&_to_and": { "type": "mapping", "mappings": ["&=> and "] } }, "filter": {//標記過濾器 "my_stopwords": { "type": "stop", "stopwords": ["the", "a"] } }, "analyzer": { "my_analyzer": { "type": "custom", "char_filter": ["html_strip", "&_to_and"], "tokenizer": "standard", "filter": ["lowercase", "my_stopwords"] } } } } }
查看配置成功
PUT /my_index/_mapping/my_type { "properties": { "title": { "type": "string", "analyzer": "my_analyzer" } } }
效果
GET /my_index/_analyze?analyzer=my_analyzer
The quick & brown fox
{ "tokens": [{ "token": "quick", "position": 2 }, { "token": "and", "position": 3 }, { "token": "brown", "position": 4 }, { "token": "fox", "position": 5 } ] }
6.一些重要概念
6.1根對象
映射的最高一層被稱爲 根對象,它可能包含下面幾項:
1.一個 properties 節點,列出了文檔中可能包含的每個字段的映射
2.多個元數據字段,每一個都以下劃線開頭,例如 _type , _id 和 _source
3.設置項,控制如何動態處理新的字段,例如 analyzer , dynamic_date_formats 和
dynamic_templates 。
4.其他設置,可以同時應用在根對象和其他 object 類型的字段上,例如 enabled ,
dynamic 和 include_in_all
6.2屬性
三個最重要的設置
type : 字段的數據類型,例如 string 和 date
index : 字段是否應當被當成全文來搜索( analyzed ),或被當成一個準確的值
( not_analyzed ),還是完全不可被搜索( no )
analyzer : 確定在索引和或搜索時全文字段使用的分析器。
6.3元數據:_source 字段
用 JSON 字符串來表示文檔主體保存在 _source 字段中。
可以通過put關閉(不建議)
6.4 文檔 ID
文檔唯一標識由四個元數據字段組成:
_id :文檔的字符串 ID
_type :文檔的類型名
_index :文檔所在的索引
_uid : _type 和 _id 連接成的 type#id
_id 字段有一個你可能用得到的設置: path 設置告訴 Elasticsearch 它需要從文檔本身的
哪個字段中生成 _id。有點像唯一索引的意思。
PUT /my_index { "mappings": { "my_type": { "_id": { "path": "doc_id" < 1 > }, "properties": { "doc_id": { "type": "string", "index": "not_analyzed" } } } } }
6.5 動態映射dynamic
爲了控制映射,增加了dynamic可設置
通過 dynamic 設置來控制這些行爲
true :自動添加字段(默認)
false :忽略字段
strict :當遇到未知字段時拋出異常
dynamic 設置可以用在根對象或任何 object 對象上。你可以將 dynamic 默認設置爲
strict ,而在特定內部對象上啓用它
7.自定義動態索引
如果你想在運行時的增加新的字段,你可能會開啓動態索引。雖然有時動態映射的規則顯得不那麼智能,幸運的是我們可以通過設置來自定義這些規則。
1.日期檢測可以通過在根對象上設置 date_detection 爲 false 來關閉
2.動態模板:可以通過匹配來選擇模板
例如,我們給 string 類型字段定義兩個模板:
es : 字段名以 _es 結尾需要使用 spanish 分析器。
en : 所有其他字段使用 english 分析器。
PUT /my_index { "mappings": { "my_type": { "dynamic_templates": [{ "es": { "match": "*_es", < 1 > "match_mapping_type": "string", "mapping": { "type": "string", "analyzer": "spanish" } } }, { "en": { "match": "*", < 2 > "match_mapping_type": "string", "mapping": { "type": "string", "analyzer": "english" } } } ] } } }
3.默認映射 _default_
PUT /my_index { "mappings": { "_default_": { "_all": { "enabled": false } }, "blog": { "_all": { "enabled": true } } } }
8.重新索引數據
修改在已存在的數據最簡單的方法是重新索引:創建一個新配置好的索引,然後將所有的文
檔從舊的索引複製到新的上。
使用【scan-scoll】來批量讀取舊索引的文檔,然後將通過【bulk API】來將它們推送給新的索引。
批量重新索引:你可以在同一時間執行多個重新索引的任務,但是你顯然不願意它們的結果有重疊。所以,可以將重建大索引的任務通過日期或時間戳字段拆分成較小的任務:
GET /old_index/_search?search_type=scan&scroll=1m { "query": { "range": { "date": { "gte": "2014-01-01", "lt": "2014-02-01" } } }, "size": 1000 }