Elasticsearch(自定義分析器)
自定義分析器
雖然Elasticsearch內建了一系列的分析器,但是真正的強大之處在於定製你自己的分析器。你可以通過在配置檔案中組合字元過濾器,分詞器和表徵過濾器,來滿足特定資料的需求。 分析器 是三個順序執行的元件的結合(字元過濾器,分詞器,表徵過濾器)。
字元過濾器
字元過濾器是讓字串在被分詞前變得更加“整潔”。例如,如果我們的文 本是HTML格式,它可能會包含一些我們不想搜尋的HTML標籤,諸如<p>或 <div>。 我們可以使用html_strip 字元過濾器來刪除所有的HTML標籤,並且將 HTML實體轉換成對應的Unicode字元,比如將Á;轉成A。 一個分析器可能包含零個到多個字元過濾器
分詞器
一個分析器 必須 包含一個分詞器。分詞器將字串分割成單獨的詞 (terms)或表徵(tokens)。standard分析器使用standard 分詞器將 字串分割成單獨的字詞,刪除大部分標點符號,但是現存的其他分詞器會 有不同的行為特徵。 例如,keword分詞器輸出和它接收到的相同的字串,不做任何分詞處 理。【whitespce 分詞器】 只通過空格來分割文字。【pattern分詞 器】可以通過正則表示式來分割 文字。
表徵過濾器
分詞結果的表徵流會根據各自的情況,傳遞給特定的表徵過濾器。但是 Elasticsearch中有更多的選擇。stemmer 表徵過濾將單詞轉化為他們 的根 形態(root form)。ascii_folding 表徵過濾器 會刪除變音符 號。 ngram和edge_ngram可以讓表徵更適合特殊匹配情況或自動完成。
建立自定義分析器
與索引設定一樣,我們預先設定好es_std分析器,我們可以再analysis欄位配置字元過濾器,分詞器和表徵過濾器: PUT /my_index { "setting":{ "analysis":{ "char_filter":{...custom character filter...}, "tokenizer":{...custom tokenizers...}, "filter":{...custom token filters...}, "analyzer":{...custom analyzers...} } } } 作為例子,我們來配置一個這樣的分析器: 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"] } } 根據以上描述來將預定義好的分詞器和過濾器組合成我們的分析器: "analyzer":{ "my_analyzer":{ "type":"custom", "char_filter":["html_strip","&_to_and"], "tokenizer":"standard", "filter":["lowercase","my_stopwords"] } } 用下面的方式將以上請求合併成一條:
PUT /my_index
{
"settings":{
"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_stopwods"]
}
}
}
}
報錯:是為什麼?
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "unknown setting [index.analyzer.my_analyzer.char_filter.0] please check that any required plugins are installed, or check the breaking changes documentation for removed settings"
}
],
"type": "illegal_argument_exception",
"reason": "unknown setting [index.analyzer.my_analyzer.char_filter.0] please check that any required plugins are installed, or check the breaking changes documentation for removed settings"
},
"status": 400
}