【Elastic Search權威指南 讀書小記7】ES之索引管理

有道雲排版好一點: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 字符,比如將 &Aacute; 轉成 Á 。

一個分析器可能包含零到多個字符過濾器。

分詞器

一個分析器 必須 包含一個分詞器。分詞器將字符串分割成單獨的詞(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 }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章