全文搜索引擎會用某種算法對要建索引的文檔進行分析, 從文檔中提取出若幹 Token(詞元) , 這些算法稱為 Tokenizer(分詞器) , 這些Token會被進壹步處理, 比如轉成小寫等, 這些處理算法被稱為 Token Filter(詞元處理器) ,被處理後的結果被稱為 Term(詞) , 文檔中包含了幾個這樣的Term被稱為 Frequency(詞頻) 。 引擎會建立Term和原文檔的Inverted Index(倒排索引), 這樣就能根據Term很快到找到源文檔了。 文本被Tokenizer處理前可能要做壹些預處理, 比如去掉裏面的HTML標記, 這些處理的算法被稱為 Character Filter(字符過濾器) , 這整個的分析算法被稱為 Analyzer(分析器) 。
整個分析過程,如下圖所示:
從第壹部分內容可以看出:Analyzer(分析器)由Tokenizer(分詞器)和Filter(過濾器)組成。
ES允許用戶通過配置文件elasticsearch.yml自定義分析器Analyzer,如下:
上面配置信息註冊了壹個分析器myAnalyzer,在次註冊了之後可以在索引或者查詢的時候直接使用。該分析器的功能和標準分析器差不多,tokenizer: standard,使用了標準分詞器 ;filter: [standard, lowercase, stop],使用了標準過濾器、轉小寫過濾器和停用詞過濾器。
ElasticSearch默認使用的標準分詞器在處理中文的時候會把中文單詞切分成壹個壹個的漢字,所以在很多時候我們會發現效果並不符合我們預期,尤其在我們使用中文文本切分之後本該為壹個詞語卻成了單個的漢字,因此這裏我們使用效果更佳的中文分詞器es-ik。
ik 帶有兩個分詞器:
區別:
下面我們來創建壹個索引,使用 ik。創建壹個名叫 iktest 的索引,設置它的分析器用 ik ,分詞器用 ik_max_word,並創建壹個 article 的類型,裏面有壹個 subject 的字段,指定其使用 ik_max_word 分詞器。
批量添加幾條數據,這裏我指定元數據 _id 方便查看,subject 內容為我隨便找的幾條新聞的標題
查詢 “希拉裏和韓國”
這裏用了高亮屬性 highlight,直接顯示到 html 中,被匹配到的字或詞將以紅色突出顯示。若要用過濾搜索,直接將 match 改為 term 即可。