您好,登錄后才能下訂單哦!
本篇內容主要講解“如何理解Elasticsearch倒排索引與分詞”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何理解Elasticsearch倒排索引與分詞”吧!
1 倒排索引
1.1 書的目錄和索引
正排索引即目錄頁,根據頁碼去找內容
倒排索引即索引頁,根據關鍵詞去找對應頁碼
1.2 搜索引擎
正排索引
文檔Id =》文檔內容、單詞的關聯關系
倒排索引
單詞 =》 文檔Id的關聯關系
左:正排索引 =》 右:倒排索引
倒排索引查詢流程
查詢包含"搜索引擎”的文檔
通過倒排索引獲得"搜索引擎”對應的文檔Id有1和3
通過正排索引查詢1和3的完整內容
返回最終結果
1.3 倒排索引的組成
1.3.1 單詞詞典( Term Dictionary )
倒排索引的重要組成
記錄所有文檔的單詞 ,一般都比較大
記錄單詞到倒排列表的關聯信息
單詞字典的實現一般是用B+ Tree ,示例如下
1.3.2 倒排列表( Posting List )
記錄了單詞對應的文檔集合,由倒排索引項( Posting )組成。
倒排索引項( Posting )主要包含如下信息:
文檔Id ,用于獲取原始信息
單詞頻率( TF, Term Frequency ),記錄該單詞在該文檔中的出現次數,用于后續相關性算分
位置( Position)
記錄單詞在文檔中的分詞位置(多個) , 用于做詞語搜索( Phrase Query )
偏移( Offset )
記錄單詞在文檔的開始和結束位置,用于做高亮顯示
案例
以搜索引擎為例
單詞字典與倒排列表整合在一起的結構
ES存儲的是JSON格式文檔,其中包含多個字段,每個字段都有自己的倒排索引。
2 分詞
將文本轉換成一系列單詞的過程,也稱文本分析,在 ES 里稱為 Analysis。
2.1 Analyzer-分詞器
分詞器是 ES 專門處理分詞的組件,組成如下:
2.1.1 Character Filters
在Tokenizer之前對原始文本進行處理,比如增加、刪除或替換字符等。
針對原始文本進行處理,比如去除 html 特殊標記符,自帶的如下:
HTML Strip 去除 html 標簽和轉換 html 實體
Mapping 進行字符替換操作
Pattern Replace 進行正則匹配替換
會影響后續tokenizer解析的postion和offset信息
2.1.2 Tokenizer
將原始文本按照一定規則切分為單詞,內置:
standard 按單詞進行分割
letter 按非字符類進行分割
whitespace 按空格進行分割
UAX URL Email 按 standard 分割,但不會分割郵箱和 url
NGram 和 Edge NGram 連詞分割
Path Hierachy 按文件路徑進行分割
示例:
POST _analyze{ "tokenizer":"path_hierarchy", "text":"/one/two/three"}
2.1.3 Token Filters
針對 tokenizer 處理的單詞進行再加工,比如轉小寫、刪除或新增等處理,內置:
lowercase 將所有 term 轉換為小寫
stop 刪除 stop words
NGram 和 Edge NGram 連詞分割
Synonym 添加近義詞的 term
示例
// filter 可以有多個 POST _analyze { "text":"a Hello world!", "tokenizer":"standard", "filter":[ "stop", // 把 a 去掉了 "lowercase",// 小寫 { "type":"ngram", "min_gram":"4", "max_gram":"4" } ] } // 得到 hell、ello、worl、orld
分詞器的調用順序
3 Analyze API
ES 提供了一個測試分詞的 API 接口,方便驗證分詞效果,endpoint 是 _analyze:
3.1 指定 analyzer
request
POST _analyze { "analyzer":"standard", # 分詞器 "text":" JavaEdge 公眾號" # 測試文本 }
response
{ "tokens" : [ { "token" : "java", # 分詞結果 "start_offset" : 1, # 起始偏移 "end_offset" : 5, # 結束偏移 "type" : "<ALPHANUM>", "position" : 0 # 分詞位置 }, { "token" : "edge", "start_offset" : 6, "end_offset" : 10, "type" : "<ALPHANUM>", "position" : 1 } ] }
3.2 指定索引中的字段
POST 測試的索引/_analyze { "field":"username", # 測試字段 "text":"hello world" # 測試文本 }
3.3 自定義分詞器
POST _analyze { "tokenizer":"standard", "filter":["lowercase"], # 自定義 "text":"hello world" }
之前的默認分詞器大寫
自定義小寫分詞器
4 內置分詞器
Standard Analyzer
默認分詞器,按詞切分,支持多語言,小寫處理
Simple Analyzer
按照非字母切分,小寫處理
Whitespace Analyzer
按空格切分
Stop Analyzer
Stop Word 指語氣助詞等修飾性詞語,比如 the、an、的、這等等,特性是相比 Simple Analyzer 多 Stop Word 處理
keyword Analyzer
不分詞,直接將輸入作為一個單詞輸出
Pattern Analyzer
通過正則表達式自定義分隔符,默認 \W+,即非字詞的符號為分隔符
Language Analyzer
提供了 30+ 常見語言的分詞器
5 中文分詞
將一個漢字序列切分成一個個單獨的詞。在英文中,單詞之間是以空格作為自然分界符,漢語中詞沒有一個形式上的分界符。而且中文博大精深,上下文不同,分詞結果也大不相同。
比如:
乒乓球拍/賣/完了
乒乓球/拍賣/完了
以下是 ES 中常見的分詞系統:
IK
實現中英文單詞的切分,可自定義詞庫,支持熱更新分詞詞典
jieba
python 中最流行餓分詞系統,支持分詞和詞性標注,支持繁體分詞,自定義詞典,并行分詞
以下是基于自然語言處理的分詞系統:
Hanlp
由一系列模型與算法組成的 java 工具包,支持索引分詞、繁體分詞、簡單匹配分詞(極速模式)、基于 CRF 模型的分詞、N- 最短路徑分詞等,實現了不少經典分詞方法。目標是普及自然語言處理在生產環境中的應用。
https://github.com/hankcs/HanLP
THULAC
THU Lexical Analyzer for Chinese ,由清華大學自然語言處理與社會人文計算
實驗室研制推出的一套中文詞法分析工具包,具有中文分詞和詞性標注功能
https://github.com/microbun/elasticsearch-thulac-plugin
6 自定義分詞器
當自帶的分詞無法滿足需求時,可以自定義分詞器,通過定義 Character Filters、Tokenizer、Token Filter 實現。自定義的分詞需要在索引的配置中設定,示例如下所示:
自定義如下分詞器
// 自定義分詞器 PUT test_index_name { "settings":{ "analysis":{ "analyzer":{ "my_customer_analyzer":{ "type":"custome", "tokenizer":"standard", "char_filter":["html_strip"], "filter":["lowercase", "asciifolding"] } } } } } // 測試自定義分詞器效果: POST test_index/_analyze { "tokenizer":"keyword", "char_filter":["html_strip"], "text":"Is this <b>a box</b>?" } // 得到 is、this、a、box
7 分詞使用說明
分詞會在如下兩個時機使用:
創建或者更新文檔時(Index Time)
會對相應的文檔進行分詞處理
索引時分詞是通過配置Index Mapping中每個字段的analyzer屬性實現的。不指定分詞時,使用默認standard。
查詢時(Search Time)
會對查詢語句進行分詞。查詢時分詞的指定方式:
查詢的時候通過analyzer指定分詞器
通過index mapping設置 search_analyzer 實現
分詞的最佳實踐
明確字段是否需要分詞,不需要分詞的字段就將 type 設置為 keyword,可以節省空間和提高寫性能。
善用 _analyze API,查看文檔的具體分詞結果
多動手測試
到此,相信大家對“如何理解Elasticsearch倒排索引與分詞”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。