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

這部分文檔主要包含:html

  • 倒排索引
  • Analyzer分詞

倒排索引

舉例類比

作個類比,看書時,咱們看到了哪一個章節,根據章節標題去目錄中檢索具體的內容。可是當咱們回憶起一些隻言片語,一些句子,一些情節時,去定位它出現的章節和頁碼,就便相似於倒排索引了。正則表達式

在es中,正排索引就是文檔id和文檔內容的關聯,而倒排索引就是文檔內容和文檔id的關聯。json

下面是三個文檔bash

文檔id 內容
1 study elasticsearch
2 learn elasticsearch
3 elasticsearch method

通過倒排索引後elasticsearch

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)ide

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

核心組成

  • 倒排索引包含兩個部分
    • 單詞詞典(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.ui

中文分詞的難點
  • 中文句子,切分紅一個個詞(不是一個個字)
  • 英文中,單詞由天然的空格做爲分隔
  • 一句中文,在不一樣的上下文,有不一樣的含義
  • 例子
    • 這事的確肯定不下來

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,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "的確",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "肯定",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "不下來",
      "start_offset" : 6,
      "end_offset" : 9,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    }
  ]
}
複製代碼

小結

本篇中接觸了es的倒排索引結構和各類analyzer分詞器,並基本介紹了各分詞器的基本使用,較爲簡單。

參考文檔

1.Elasticsearch倒排索引結構

2.Elasticsearch Analysis


以爲不錯,請點個贊吧

zan
相關文章
相關標籤/搜索