1. 程式人生 > 程式設計 >999 - Elasticsearch Analysis 01

999 - Elasticsearch Analysis 01

簡介

Analysis在建立索引或搜尋時指定,將文字解析成倒排索引,以供搜尋。
簡單解釋下倒排索引:通常書本的目錄就是正排索引,根據目錄找章節;而倒排索引就是根據內容(例如一個單詞)找所在的章節。

Analyzer

analyzer,內建或自定義,是一個包含三個構建塊(依次為character filterstokenizerstoken filters)的包。

例如:一個內建的english analyzer在轉換句子The QUICK brown foxes jumped over the lazy dog!時:

  1. 轉為小寫。
  2. 刪除對搜尋無意義的詞元:the(停止詞,stopwords
    )。
  3. 歸納詞幹,例如:foxes → fox,jumped → jump,lazy → lazi。
  4. 最後新增這些條件到倒排索引中:[quick,brown,fox,jump,over,lazi,dog]。
  5. 當查詢時,可以查詢"a query fox",雖然該字串不在原文字中,但當使用了同樣的analyzer時,該句子中的單詞與倒排索引中的詞元可以匹配上。

Character filters

  • 接收字元流,通過新增、刪除、修改字元來轉換字元流。
  • 例如從流中去掉<b>這樣的HTML元素。
  • 可以有0或多個,按照設定的順序呼叫。

Tokenizer

  • 接收一個字元流,分解為詞元,然後輸出詞元流。
  • 例如,whitespace tokenizer就會把所有的空白符去掉,"Quick brown fox!"就會被分解成詞元:[Quick,fox!]
  • 同時Tokenizer負責記錄每個詞元的順序或位置,以及原單詞的起始結束字元偏移量。
  • 必須而且只能有一個Tokenizer。

Token filters

  • 接收詞元流,可以新增、刪除、修改詞元。
  • 例如:lowercase token filter將所有的詞元轉為小寫,stop token filter刪除掉停止詞,synonym toekn filter將引入同義詞到詞元流中。
  • Token filter不可以改變每個詞元的位置或字元偏移量。
  • 可以有0或多個,按照設定的順序呼叫。

測試analyzers

可以在請求體中指定analyzer(或者tokenizer、token filter、Character Filter),

GET _analyze
{
  "analyzer": "whitespace","text": "The quick brown fox."
}

GET _analyze
{
  "analyzer": "english","text": "The QUICK brown foxes jumped over the lazy dog!"
}

GET _analyze
{
  "tokenizer": "whitespace","filter": ["lowercase","stop"],"text": "The QUICK brown foxes jumped over the lazy dog!"
}
複製程式碼

從上面第二個的返回結果中可以看到位置和起始結束字元偏移量

offset:詞項邊界,用於高亮查詢。

position:在檔案中的位置,用於保證詞語查詢的詞語的順序。

{
  "tokens" : [
    {
      "token" : "quick","start_offset" : 4,"end_offset" : 9,"type" : "<ALPHANUM>","position" : 1
    },{
      "token" : "brown","start_offset" : 10,"end_offset" : 15,"position" : 2
    },{
      "token" : "fox","start_offset" : 16,"end_offset" : 21,"position" : 3
    },{
      "token" : "jump","start_offset" : 22,"end_offset" : 28,"position" : 4
    },{
      "token" : "over","start_offset" : 29,"end_offset" : 33,"position" : 5
    },{
      "token" : "lazi","start_offset" : 38,"end_offset" : 42,"position" : 7
    },{
      "token" : "dog","start_offset" : 43,"end_offset" : 46,"position" : 8
    }
  ]
}
複製程式碼