1. 程式人生 > >Elasticsearch(自定義分析器)

Elasticsearch(自定義分析器)

自定義分析器

雖然Elasticsearch內建了一系列的分析器,但是真正的強大之處在於定製你自己的分析器。你可以通過在配置檔案中組合字元過濾器,分詞器和表徵過濾器,來滿足特定資料的需求。 分析器  是三個順序執行的元件的結合(字元過濾器,分詞器,表徵過濾器)。  

字元過濾器

    字元過濾器是讓字串在被分詞前變得更加“整潔”。例如,如果我們的文    本是HTML格式,它可能會包含一些我們不想搜尋的HTML標籤,諸如<p>或    <div>。              我們可以使用html_strip 字元過濾器來刪除所有的HTML標籤,並且將    HTML實體轉換成對應的Unicode字元,比如將&Aacute;轉成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
}