溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何理解Elasticsearch倒排索引與分詞

發(fā)布時(shí)間:2021-10-23 11:47:29 來(lái)源:億速云 閱讀:152 作者:iii 欄目:web開(kāi)發(fā)

本篇內(nèi)容主要講解“如何理解Elasticsearch倒排索引與分詞”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何理解Elasticsearch倒排索引與分詞”吧!

1 倒排索引

1.1 書(shū)的目錄和索引

正排索引即目錄頁(yè),根據(jù)頁(yè)碼去找內(nèi)容

如何理解Elasticsearch倒排索引與分詞

倒排索引即索引頁(yè),根據(jù)關(guān)鍵詞去找對(duì)應(yīng)頁(yè)碼

如何理解Elasticsearch倒排索引與分詞

1.2 搜索引擎

  • 正排索引

        文檔Id =》文檔內(nèi)容、單詞的關(guān)聯(lián)關(guān)系

  • 倒排索引

         單詞 =》 文檔Id的關(guān)聯(lián)關(guān)系

  • 左:正排索引 =》 右:倒排索引

如何理解Elasticsearch倒排索引與分詞

倒排索引查詢(xún)流程

查詢(xún)包含"搜索引擎”的文檔

  1. 通過(guò)倒排索引獲得"搜索引擎”對(duì)應(yīng)的文檔Id有1和3

  2. 通過(guò)正排索引查詢(xún)1和3的完整內(nèi)容

  3. 返回最終結(jié)果

1.3 倒排索引的組成

1.3.1 單詞詞典( Term Dictionary )

倒排索引的重要組成

  • 記錄所有文檔的單詞 ,一般都比較大

  • 記錄單詞到倒排列表的關(guān)聯(lián)信息

單詞字典的實(shí)現(xiàn)一般是用B+ Tree ,示例如下

如何理解Elasticsearch倒排索引與分詞

1.3.2 倒排列表( Posting List )

記錄了單詞對(duì)應(yīng)的文檔集合,由倒排索引項(xiàng)( Posting )組成。

倒排索引項(xiàng)( Posting )主要包含如下信息:

  • 文檔Id ,用于獲取原始信息

  • 單詞頻率( TF, Term Frequency ),記錄該單詞在該文檔中的出現(xiàn)次數(shù),用于后續(xù)相關(guān)性算分

  • 位置( Position)

  • 記錄單詞在文檔中的分詞位置(多個(gè)) , 用于做詞語(yǔ)搜索( Phrase Query )

  • 偏移( Offset )

記錄單詞在文檔的開(kāi)始和結(jié)束位置,用于做高亮顯示

案例

以搜索引擎為例

如何理解Elasticsearch倒排索引與分詞

單詞字典與倒排列表整合在一起的結(jié)構(gòu)

如何理解Elasticsearch倒排索引與分詞

ES存儲(chǔ)的是JSON格式文檔,其中包含多個(gè)字段,每個(gè)字段都有自己的倒排索引。

2 分詞

將文本轉(zhuǎn)換成一系列單詞的過(guò)程,也稱(chēng)文本分析,在 ES 里稱(chēng)為 Analysis。

2.1 Analyzer-分詞器

分詞器是 ES 專(zhuān)門(mén)處理分詞的組件,組成如下:

2.1.1 Character Filters

在Tokenizer之前對(duì)原始文本進(jìn)行處理,比如增加、刪除或替換字符等。

針對(duì)原始文本進(jìn)行處理,比如去除 html 特殊標(biāo)記符,自帶的如下:

  • HTML Strip 去除 html 標(biāo)簽和轉(zhuǎn)換 html 實(shí)體

  • Mapping 進(jìn)行字符替換操作

  • Pattern Replace 進(jìn)行正則匹配替換

會(huì)影響后續(xù)tokenizer解析的postion和offset信息

如何理解Elasticsearch倒排索引與分詞

2.1.2 Tokenizer

將原始文本按照一定規(guī)則切分為單詞,內(nèi)置:

  • standard 按單詞進(jìn)行分割

  • letter 按非字符類(lèi)進(jìn)行分割

  • whitespace 按空格進(jìn)行分割

  • UAX URL Email 按 standard 分割,但不會(huì)分割郵箱和 url

  • NGram 和 Edge NGram 連詞分割

  • Path Hierachy 按文件路徑進(jìn)行分割

示例:

POST _analyze{ "tokenizer":"path_hierarchy", "text":"/one/two/three"}

如何理解Elasticsearch倒排索引與分詞

如何理解Elasticsearch倒排索引與分詞

2.1.3 Token Filters

針對(duì) tokenizer 處理的單詞進(jìn)行再加工,比如轉(zhuǎn)小寫(xiě)、刪除或新增等處理,內(nèi)置:

  • lowercase 將所有 term 轉(zhuǎn)換為小寫(xiě)

  • stop 刪除 stop words

  • NGram 和 Edge NGram 連詞分割

  • Synonym 添加近義詞的 term

示例

// filter 可以有多個(gè) POST _analyze {     "text":"a Hello world!",     "tokenizer":"standard",     "filter":[     "stop", // 把 a 去掉了     "lowercase",// 小寫(xiě)     {         "type":"ngram",         "min_gram":"4",         "max_gram":"4"     }     ] } // 得到 hell、ello、worl、orld

 如何理解Elasticsearch倒排索引與分詞

分詞器的調(diào)用順序

如何理解Elasticsearch倒排索引與分詞

3 Analyze API

ES 提供了一個(gè)測(cè)試分詞的 API 接口,方便驗(yàn)證分詞效果,endpoint 是 _analyze:

3.1 指定 analyzer

request

POST _analyze {     "analyzer":"standard", # 分詞器     "text":" JavaEdge 公眾號(hào)" # 測(cè)試文本 }

response

{   "tokens" : [     {       "token" : "java", # 分詞結(jié)果       "start_offset" : 1, # 起始偏移       "end_offset" : 5, # 結(jié)束偏移       "type" : "<ALPHANUM>",       "position" : 0 # 分詞位置     },     {       "token" : "edge",       "start_offset" : 6,       "end_offset" : 10,       "type" : "<ALPHANUM>",       "position" : 1     }   ] }

 如何理解Elasticsearch倒排索引與分詞

3.2 指定索引中的字段

POST  測(cè)試的索引/_analyze   {     "field":"username", # 測(cè)試字段     "text":"hello world" # 測(cè)試文本 }

  如何理解Elasticsearch倒排索引與分詞

3.3 自定義分詞器

POST _analyze {     "tokenizer":"standard",     "filter":["lowercase"], # 自定義     "text":"hello world" }

之前的默認(rèn)分詞器大寫(xiě)

 如何理解Elasticsearch倒排索引與分詞

自定義小寫(xiě)分詞器

如何理解Elasticsearch倒排索引與分詞

4 內(nèi)置分詞器

Standard Analyzer

默認(rèn)分詞器,按詞切分,支持多語(yǔ)言,小寫(xiě)處理

Simple Analyzer

按照非字母切分,小寫(xiě)處理

如何理解Elasticsearch倒排索引與分詞

Whitespace Analyzer

按空格切分

如何理解Elasticsearch倒排索引與分詞

Stop Analyzer

Stop Word 指語(yǔ)氣助詞等修飾性詞語(yǔ),比如 the、an、的、這等等,特性是相比 Simple Analyzer 多 Stop Word  處理

  如何理解Elasticsearch倒排索引與分詞

keyword Analyzer

不分詞,直接將輸入作為一個(gè)單詞輸出

 如何理解Elasticsearch倒排索引與分詞

Pattern Analyzer

通過(guò)正則表達(dá)式自定義分隔符,默認(rèn) \W+,即非字詞的符號(hào)為分隔符

如何理解Elasticsearch倒排索引與分詞

Language Analyzer

提供了 30+ 常見(jiàn)語(yǔ)言的分詞器

5 中文分詞

將一個(gè)漢字序列切分成一個(gè)個(gè)單獨(dú)的詞。在英文中,單詞之間是以空格作為自然分界符,漢語(yǔ)中詞沒(méi)有一個(gè)形式上的分界符。而且中文博大精深,上下文不同,分詞結(jié)果也大不相同。

比如:

  • 乒乓球拍/賣(mài)/完了

  • 乒乓球/拍賣(mài)/完了

以下是 ES 中常見(jiàn)的分詞系統(tǒng):

IK

實(shí)現(xiàn)中英文單詞的切分,可自定義詞庫(kù),支持熱更新分詞詞典

jieba

python 中最流行餓分詞系統(tǒng),支持分詞和詞性標(biāo)注,支持繁體分詞,自定義詞典,并行分詞

以下是基于自然語(yǔ)言處理的分詞系統(tǒng):

Hanlp

由一系列模型與算法組成的 java 工具包,支持索引分詞、繁體分詞、簡(jiǎn)單匹配分詞(極速模式)、基于 CRF 模型的分詞、N-  最短路徑分詞等,實(shí)現(xiàn)了不少經(jīng)典分詞方法。目標(biāo)是普及自然語(yǔ)言處理在生產(chǎn)環(huán)境中的應(yīng)用。

https://github.com/hankcs/HanLP

THULAC

  • THU Lexical Analyzer for Chinese ,由清華大學(xué)自然語(yǔ)言處理與社會(huì)人文計(jì)算

         實(shí)驗(yàn)室研制推出的一套中文詞法分析工具包,具有中文分詞和詞性標(biāo)注功能

          https://github.com/microbun/elasticsearch-thulac-plugin

6 自定義分詞器

當(dāng)自帶的分詞無(wú)法滿(mǎn)足需求時(shí),可以自定義分詞器,通過(guò)定義 Character Filters、Tokenizer、Token Filter  實(shí)現(xiàn)。自定義的分詞需要在索引的配置中設(shè)定,示例如下所示:

自定義如下分詞器

如何理解Elasticsearch倒排索引與分詞
// 自定義分詞器 PUT test_index_name {   "settings":{      "analysis":{       "analyzer":{         "my_customer_analyzer":{           "type":"custome",           "tokenizer":"standard",           "char_filter":["html_strip"],           "filter":["lowercase", "asciifolding"]         }       }     }   } }  // 測(cè)試自定義分詞器效果: POST test_index/_analyze {   "tokenizer":"keyword",   "char_filter":["html_strip"],   "text":"Is this <b>a box</b>?" }  // 得到 is、this、a、box

7 分詞使用說(shuō)明

分詞會(huì)在如下兩個(gè)時(shí)機(jī)使用:

創(chuàng)建或者更新文檔時(shí)(Index Time)

會(huì)對(duì)相應(yīng)的文檔進(jìn)行分詞處理

索引時(shí)分詞是通過(guò)配置Index Mapping中每個(gè)字段的analyzer屬性實(shí)現(xiàn)的。不指定分詞時(shí),使用默認(rèn)standard。

查詢(xún)時(shí)(Search Time)

會(huì)對(duì)查詢(xún)語(yǔ)句進(jìn)行分詞。查詢(xún)時(shí)分詞的指定方式:

  • 查詢(xún)的時(shí)候通過(guò)analyzer指定分詞器

  • 通過(guò)index mapping設(shè)置 search_analyzer 實(shí)現(xiàn)

分詞的最佳實(shí)踐

  • 明確字段是否需要分詞,不需要分詞的字段就將 type 設(shè)置為 keyword,可以節(jié)省空間和提高寫(xiě)性能。

  • 善用 _analyze API,查看文檔的具體分詞結(jié)果

  • 多動(dòng)手測(cè)試

到此,相信大家對(duì)“如何理解Elasticsearch倒排索引與分詞”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI