1. 程式人生 > 程式設計 >Elasticsearch入門(1)-倒排索引和分詞器

Elasticsearch入門(1)-倒排索引和分詞器

這部分檔案主要包含:

  • 倒排索引
  • 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)

以上就是一個簡單的正排索引和倒排索引的例子

核心組成

  • 倒排索引包含兩個部分
    • 單詞詞典(Term Dictionary),記錄所有檔案的單詞,記錄單詞到倒排列表的關聯關係
      • 單詞詞典一般較大,可以通過B+樹雜湊鏈法實現,以滿足高效能的插入與查詢
    • 倒排列表(Posting List)-記錄了單詞對應的檔案結合,由倒排索引項組成
      • 倒排索引項(Posting)
        • 檔案ID
        • 詞頻TF - 該單詞在檔案中出現的次數,用於相關性評分
        • 位置(Position) - 單詞在檔案中分詞的位置。用於語句搜尋(phrase query)
        • 偏移(Offset) - 記錄單詞的開始結束位置,實現高亮顯示

一個例子-以單詞 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

使用_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

standard analyzer

  • 是es預設分詞器
  • 按詞切分
  • 小寫處理

simple analyzer

simple

  • 按照非字母切分,非字母的都被去除
  • 小寫處理

whitespace Analyzer

white

  • 按空格切分

stop analyzer

stop

  • 相比simple analyzer多了stop filter
    • 會把the,a,is等修飾性詞語去除

Keyword Analyzer

keyword

  • 不分詞,直接將輸入當一個term輸出

Pattern Analyzer

pattern

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

ICU

  • 需要安裝plugin
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分詞器,並基本介紹了各分詞器的基本使用,較為簡單。

參考檔案

1.Elasticsearch倒排索引結構

2.Elasticsearch Analysis


覺得不錯,請點個贊吧

zan