Elasticsearch 自定義分析器 analyzer API 檢視文字內容如何被分析
Elasticsearch內建了一系列分析器,但是ES支援自定義分析器。
通過在配置檔案中組合字元過濾器,分詞器和表徵過濾器可以滿足特定資料的要求。
分析器是三個順序執行的元件的結合(字元過濾器、分詞器、表徵過濾器)
- 字元過濾器(char_filter):
讓字串在被分詞前變得更加“整潔”。
如,html_strip 字元過濾器可刪除所有的HTML標籤諸如<p>或<div>,並可將HTML實體轉換成對應的Unicode字元,如將 Á 轉成 A 。
- 分詞器(filter):
將字串分割成單獨的詞(terms)或表徵(tokens)。如:
standard分詞器將字串分割成單獨的字詞,刪除大部分標點符號;
keyword分詞器輸出和它接收到的相同的字串,不做任何分詞處理;
whitespace分詞器只通過空格來分割文字;
pattern分詞器可通過正則表示式分割文字。
- 表徵過濾器(analyzer):
分詞結果的表徵流根據各自情況傳遞給特定表徵過濾器。
表徵過濾器可能修改,新增或刪除表徵。如:
lowercase表徵過濾器將大寫轉換為小寫;
stop表徵過濾器刪除特定表徵;
stemmer表徵過濾器將單詞轉化為它們的根形態(root form);
ascii_folding表徵過濾器刪除變音符合(如從 très 轉為 tres );
ngram和edge_ngram可讓表徵更適合特殊匹配情況或自動完成。
建立自定義分析器 my_analyzer :
在 analysis 欄位下配置字元過濾器、分詞器和表徵過濾器:
PUT /my_index { "settings":{ "analysis":{ "char_filter":{ ... custom character filters ... }, "tokenizer":{ ... custom tokenizers ... }, "filter":{ ... custom token filter ... }, "analyzer":{ ... custom analyzers ... } } } }
我們將配置一個這樣的分析器:
1.用 html_strip 字元過濾器去除所有的 HTML 標籤;
2.將 & 替換成 and ,將 # 替換成 four ,使用一個自定義的 mapping 字元過濾器;
3.使用 standard 分詞器分割單詞;
4.使用 lowercase 表徵過濾器將詞轉為小寫;
5.用 stop 表徵過濾器去除自定義停用詞。
DELETE es_analyzer_test
PUT es_analyzer_test
{
"settings": {
"analysis": {
"char_filter": {
"char_filter_test":{
"type":"mapping",
"mappings":["&=>and","#=>four"]
}
},
"filter": {
"my_stopwords":{
"type":"stop",
"stopwords":["the","a","and","stop"]
}
},
"analyzer": {
"my_analyzer":{
"type":"custom",
"char_filter":["html_strip","char_filter_test"],
"tokenizer":"standard",
"filter":["lowercase","my_stopwords"]
}
}
}
}
}
測試分詞器是否達到預期目標:
GET es_analyzer_test/_analyze
{
"text": ["HELLO & # the a stop world"],
"analyzer": "my_analyzer"
}
相應結果如下:
{
"tokens": [
{
"token": "hello",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "four",
"start_offset": 8,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "world",
"start_offset": 21,
"end_offset": 26,
"type": "<ALPHANUM>",
"position": 6
}
]
}
達成我們預期目標。