基于ElasticSearch Analyzer的使用規(guī)則詳解
analyzer的使用規(guī)則
查詢只能查找倒排索引表中真實存在的項, 所以保證文檔在索引時與查詢字符串在搜索時應(yīng)用相同的分析過程非常重要,這樣查詢的項才能夠匹配倒排索引中的項。
盡管是在說 文檔 ,不過分析器可以由每個字段決定。 每個字段都可以有不同的分析器,既可以通過配置為字段指定分析器,也可以使用更高層的類型(type)、索引(index)或節(jié)點(node)的默認(rèn)配置。在索引時,一個字段值是根據(jù)配置或默認(rèn)分析器分析的。
例如為 my_index 新增一個字段:
PUT /my_index/_mapping/my_type { "my_type": { "properties": { "english_title": { "type": "string", "analyzer": "english" } } } }
現(xiàn)在我們就可以通過使用 analyze API 來分析單詞 Foxes ,進(jìn)而比較 english_title 字段和 title 字段在索引時的分析結(jié)果:
GET /my_index/_analyze { "field": "my_type.title", "text": "Foxes" } GET /my_index/_analyze { "field": "my_type.english_title", "text": "Foxes" }
- 字段 title ,使用默認(rèn)的 standard 標(biāo)準(zhǔn)分析器,返回詞項 foxes 。
- 字段 english_title ,使用 english 英語分析器,返回詞項 fox 。
這意味著,如果使用底層 term 查詢精確項 fox 時, english_title 字段會匹配但 title 字段不會。
如同 match 查詢這樣的高層查詢知道字段映射的關(guān)系,能為每個被查詢的字段應(yīng)用正確的分析器。 可以使用 validate-query API 查看這個行為:
GET /my_index/my_type/_validate/query?explain { "query": { "bool": { "should": [ { "match": { "title": "Foxes"}}, { "match": { "english_title": "Foxes"}} ] } } }
返回語句的 explanation 結(jié)果:
(title:foxes english_title:fox)
match 查詢?yōu)槊總€字段使用合適的分析器,以保證它在尋找每個項時都為該字段使用正確的格式。
默認(rèn)分析器
雖然我們可以在字段層級指定分析器, 但是如果該層級沒有指定任何的分析器,那么我們?nèi)绾文艽_定這個字段使用的是哪個分析器呢?
分析器可以從三個層面進(jìn)行定義:按字段(per-field)、按索引(per-index)或全局缺?。╣lobal default)。Elasticsearch 會按照以下順序依次處理,直到它找到能夠使用的分析器。索引時的順序如下:
- 字段映射里定義的 analyzer ,否則
- 索引設(shè)置中名為 default 的分析器,默認(rèn)為
- standard 標(biāo)準(zhǔn)分析器
在搜索時,順序有些許不同:
- 查詢自己定義的 analyzer ,否則
- 字段映射里定義的 analyzer ,否則
- 索引設(shè)置中名為 default 的分析器,默認(rèn)為
- standard 標(biāo)準(zhǔn)分析器
有時,在索引時和搜索時使用不同的分析器是合理的。 我們可能要想為同義詞建索引(例如,所有 quick 出現(xiàn)的地方,同時也為 fast 、 rapid 和 speedy 創(chuàng)建索引)。但在搜索時,我們不需要搜索所有的同義詞,取而代之的是尋找用戶輸入的單詞是否是 quick 、 fast 、 rapid 或 speedy 。
為了區(qū)分,Elasticsearch 也支持一個可選的 search_analyzer 映射,它僅會應(yīng)用于搜索時( analyzer 還用于索引時)。還有一個等價的 default_search 映射,用以指定索引層的默認(rèn)配置。
如果考慮到這些額外參數(shù),一個搜索時的 完整 順序會是下面這樣:
- 查詢自己定義的 analyzer ,否則
- 字段映射里定義的 search_analyzer ,否則
- 字段映射里定義的 analyzer ,否則
- 索引設(shè)置中名為 default_search 的分析器,默認(rèn)為
- 索引設(shè)置中名為 default 的分析器,默認(rèn)為
- standard 標(biāo)準(zhǔn)分析器
Elasticsearch分詞(Analyzer)
一、什么是Analysis ?
Analysis 叫做分詞,就是將文本轉(zhuǎn)換為一系列單詞(term/token)的過程。
Analysis 是通過Analyzer來實現(xiàn)的。
可使用Elasticserach內(nèi)置的分析器或按需優(yōu)化分需求或安裝分析器插件 。
在數(shù)據(jù)寫入的時候轉(zhuǎn)換詞條于Query語句查詢的時候也需要用相同的分析器。
二、Analyzer的組成與工作機(jī)制
Character Filter 針對原始文本處理,例如去除html。
Tokenizer 按規(guī)則切分為單詞。Tokenizer Filter將切分的單詞進(jìn)行加工,小寫,刪除stopwords,增加同義詞。
三、Elasticserach內(nèi)置的一些分詞器
1) _analyzer API 三種使用方法
2) Standard Analyzer
原理
示例
3)Simple Analyzer
原理
示例
4)Whitespace Analyzer
原理
示例
5)Stop Analyzer
原理
示例
6)Keyword Analyzer
原理
示例
7)Pattern Analyzer
原理
示例
8)Language Analyzer
支持按語言分詞
示例
四、中文分詞
中文分詞的難點:
中文句子,切成一個一個詞(不是一個一個字)。英文中,單詞有自然的空格作為分隔。一句中文,在不同的上下文,有不同的理解。
1)ICU Analyzer
原理
演示(需要提前安裝 ICU Analyze 插件)
2)IK
3) THULAC
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入解讀Java代碼組織中的package包結(jié)構(gòu)
這篇文章主要介紹了Java代碼組織中的package包結(jié)構(gòu),是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2016-03-03spring boot 自動更新靜態(tài)文件和后臺代碼的實例
下面小編就為大家分享一篇spring boot 自動更新靜態(tài)文件和后臺代碼的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12Java基于TCP協(xié)議socket網(wǎng)絡(luò)編程的文件傳送的實現(xiàn)
這篇文章主要介紹了Java基于TCP協(xié)議socket網(wǎng)絡(luò)編程的文件傳送的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12