Elasticsearch入門(1)-倒排索引和分詞器
阿新 • • 發佈:2019-12-31
這部分檔案主要包含:
- 倒排索引
- Analyzer分詞
倒排索引
舉例類比
做個類比,看書時,我們看到了哪個章節,根據章節標題去目錄中檢索具體的內容。但是當我們回憶起一些隻言片語,一些句子,一些情節時,去定位它出現的章節和頁碼,就便類似於倒排索引了。
在es中,正排索引就是檔案id和檔案內容的關聯,而倒排索引就是檔案內容和檔案id的關聯。
下面是三個檔案
檔案id | 內容 |
---|---|
1 | study elasticsearch |
2 | learn elasticsearch |
3 | elasticsearch method |
經過倒排索引後
Term(單詞) | Count | DocumentID:Position |
---|---|---|
elasticsearch | 3 | 1:1,2:4,3:0 |
study | 1 | 1:0 |
learn | 1 | 2:0 |
method | 1 | 3:1 |
(Term,一段文字經過分析後會輸出一串單詞,一個一個的叫做Term)
以上就是一個簡單的正排索引和倒排索引的例子
核心組成
- 倒排索引包含兩個部分
一個例子-以單詞 elasticsearch
為例
檔案id | 內容 |
---|---|
1 | study elasticsearch |
2 | learn elasticsearch |
3 | elasticsearch method |
elasticsearch的Posting List
如下
Doc Id | TF | Position | Offset |
---|---|---|---|
1 | 1 | 1 | <6,19> |
2 | 1 | 1 | <6,19> |
3 | 1 | 0 | <0,13> |
elasticsearch的倒排索引特點
- Elasticsearch的json檔案中的每個欄位,都有自己的倒排索引
- 可以指定對某些欄位不做索引
- 優點:節省儲存空間
- 缺點:欄位無法被搜尋
Analyzer分詞
Analysis和Analyzer
-
Analysis
(文字分析) - 是把全文的轉換為一系列單詞(term/token)的過程,也叫分詞 -
Analysis
是通過Analyzer
來實現的- 可使用elasticsearch內建的分析器或者按需定製分析器
- 除了在資料寫入時轉換詞條,匹配Query語句時候也需要用相同的分析器對查詢語句進行分析
input:
Elasticsearch Server
output:
elasticsearch
server
# 仔細看會發現,經過分詞器處理後,Elasticsearch被轉換成了elasticsearch,大寫字母自動轉換成了小寫
複製程式碼
Analyzer的組成
- 分詞器是專門處理分詞的元件,Analyzer由三部分組成
- Character Filters(針對原始文書處理,例如去除html)
- Tokenizer(按照規則切分為單詞)
- Token Filter(將切分的單詞進行加工,小寫,刪除stopwords,增加同義詞)
使用_analyzer API
直接指定Analyzer進行測試
GET /_analyze
{
"analyzer": "standard","text":"Mastering Elasticsearch,elasticsearch in Action"
}
複製程式碼
指定索引的欄位進行測試
POST my_index/_analyze
{
"field": "title","text": "Mastering Elasticsearch"
}
複製程式碼
自定義分詞器進行測試
POST /_analyze
{
"tokenizer": "standard","filter": ["lowercase"],"text": "Mastering Elastricsearch"
}
複製程式碼
elasticsearch的內建分詞器
名稱 | 作用 |
---|---|
Standard Analyzer | 預設分詞器,按詞切分,小寫處理 |
Simple Analyzer | 按照非字母切分(符號被過濾),小寫處理 |
Stop Analyzer | 小寫處理,停用詞過濾(a/the/is) |
Whitespace Analyzer | 按照空格切分,不轉小寫 |
Keyword Analyzer | 部分詞,直接將輸入當做輸出 |
Patter Analyzer | 正則表示式,預設\W+(非字元分割) |
Language | 提供了30多種常見語言的分詞器 |
Customer Analyzer | 自定義分詞器 |
standard analyzer
- 是es預設分詞器
- 按詞切分
- 小寫處理
simple analyzer
- 按照非字母切分,非字母的都被去除
- 小寫處理
whitespace Analyzer
- 按空格切分
stop analyzer
- 相比simple analyzer多了stop filter
- 會把the,a,is等修飾性詞語去除
Keyword Analyzer
- 不分詞,直接將輸入當一個term輸出
Pattern Analyzer
- 使用正則表示式進行分詞(不懂正則的小夥伴可檢視正則表示式30分鐘入門教程)
- 預設是
\W+
,非字元的符號進行分隔
Language Analyzer
一組分析特定語言文字的分析器,支援以下型別:
arabic
,armenian
,basque
,bengali
,brazilian
,bulgarian
,catalan
,cjk
,czech
,danish
,dutch
,english
,finnish
,french
,galician
,german
,greek
,hindi
,hungarian
,indonesian
,irish
,italian
,latvian
,lithuanian
,norwegian
,persian
,portuguese
,romanian
,russian
,sorani
,spanish
,swedish
,turkish
,thai
.
中文分詞的難點
- 中文句子,切分成一個個詞(不是一個個字)
- 英文中,單詞由自然的空格作為分隔
- 一句中文,在不同的上下文,有不同的含義
- 例子
- 這事的確確定不下來
ICU Analyzer
- 需要安裝plugin
- ELasticsearch-plugin install analysis-icu(參考我之前的安裝檔案:Elasticsearch 的安裝與簡單配置)
- 提供了Unicode的支援,更好的支援亞洲語言
GET _analyze
{
"analyzer": "icu_analyzer","text": "這事的確確定不下來"
}
複製程式碼
分詞結果
{
"tokens" : [
{
"token" : "這","start_offset" : 0,"end_offset" : 1,"type" : "<IDEOGRAPHIC>","position" : 0
},{
"token" : "事","start_offset" : 1,"end_offset" : 2,"position" : 1
},{
"token" : "的確","start_offset" : 2,"end_offset" : 4,"position" : 2
},{
"token" : "確定","start_offset" : 4,"end_offset" : 6,"position" : 3
},{
"token" : "不下來","start_offset" : 6,"end_offset" : 9,"position" : 4
}
]
}
複製程式碼
小結
本篇中接觸了es的倒排索引結構和各種analyzer分詞器,並基本介紹了各分詞器的基本使用,較為簡單。
參考檔案
覺得不錯,請點個贊吧