小白學ES 09 - ES如何利用分析器分析索引 + 如何定製分析器
文章目錄
1 索引分析
索引分析: 將文字塊按照一定的策略分解, 並建立倒排索引的過程. 這個過程由分析器(analyzers)完成.
1.1 分析器的組成
① 字元過濾器(character filter): 去除HTML標籤, 或轉換"&"為"and"等.
② 分詞器(tokenizer): 按照某種規律, 如根據空格、逗號等, 將文字塊進行分解.
③ 標記過濾器(token filter): 所有被分詞器分解的詞都將經過token filters的處理, 它可以修改詞(如小寫化處理)、去掉詞(根據某一規則去掉無意義的詞, 如"a", “the”, “的"等), 增加詞(如同義詞"jump”、"leap"等).
注意: 人們一般將分析器通稱為分詞器, 並不是相等的關係, 而是包含的關係.
1.2 倒排索引核心原理-normalization
建立倒排索引時, 會執行 normalization(正常化)操作 —— 將拆分的各個單詞進行相應的處理, 以提高搜尋時命中相關聯的文件的概率.
normalization的方式有: 時態轉換, 單複數轉換, 同義詞轉換, 大小寫轉換等.
比如: 文件中包含 “mom likes small dogs”, 在建立索引時通過normalization處理, 通過 “mother liked little dog” 也能搜尋到相關的文件.
2 ES的預設分析器
-
ES中的預設分析器: standard tokenizer, 標準分析器, 以單詞為邊界進行分詞. 具有如下功能:
standard token filter: 去掉無意義的標籤, 如<>, &, - 等.
lowercase token filter: 將所有字母轉換為小寫字母.
stop token filer(預設被禁用): 移除停用詞, 比如"a"、"the"等.
-
測試預設分析器:
GET _analyze // ES引擎中已有standard分詞器, 所以可以不指定index { "analyzer": "standard", "text": "There-is a DOG<br/> in house &" }
3 修改分詞器
-
建立索引後可以新增新的分詞器, 新增之前必須先關閉索引, 新增之後再開啟:
// 先關閉索引: POST address/_close // 啟用English停用詞token filter PUT address/_settings { "analysis": { "analyzer": { "my_token_filter": { // 自定義的分詞器名稱 "type": "standard", "stopwords": "_english_" } } } } // 開啟索引: POST address/_open
-
使用具有停詞功能的分詞器進行分詞:
GET address/_analyze { "analyzer": "my_token_filter", "text": "There-is a DOG<br/> in house &" }
-
返回結果減少了停用詞:
{ "tokens": [ { "token": "dog", "start_offset": 11, "end_offset": 14, "type": "<ALPHANUM>", "position": 3 }, { "token": "br", "start_offset": 15, "end_offset": 17, "type": "<ALPHANUM>", "position": 4 }, { "token": "house", "start_offset": 23, "end_offset": 28, "type": "<ALPHANUM>", "position": 6 } ] }
4 定製分詞器
4.1 向索引中新增自定義的分詞器
注意: 要先關閉索引, 再新增, 然後再開啟索引.
PUT address/_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"], // 跳過HTML標籤, 將&符號轉換為"and"
"tokenizer": "standard",
"filter": ["lowercase", "my_stopwords"] // 轉換為小寫
}
}
}
}
4.2 測試自定義分析器
GET address/_analyze
{
"analyzer": "my_analyzer",
"text": "There-is a DOG<br/> in house &"
}
響應結果中已經對大寫單詞、HTML標籤, 以及"&"做了處理. 鑑於篇幅所限, 這裡省去.
4.3 向對映中新增自定義的分析器
PUT address/_mapping/province
{
"properties": {
"content": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
此時檢視mapping資訊:
PUT address/_mapping/province
{
"properties": {
"content": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
發現自定義的分析器已經配置到province上了:
{
"address": {
"mappings": {
"province": {
"properties": {
"content": {
"type": "text",
"analyzer": "my_analyzer"
},
"description": {
"type": "text"
}
}
}
}
}
}
版權宣告
作者: ma_shoufeng(馬瘦風)
出處: CSDN 馬瘦風的部落格
您的支援是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段宣告, 且在文章頁面明顯位置給出原文連結, 否則博主保留追究相關人員法律責任的權利.