Elasticsearch中什麼是 tokenizer、analyzer、filter ?

Elastic search 是一個能快速幫忙建立起搜索功能的,最好之一的引擎。

搜索引擎的構建模塊 大都包含 tokenizers(分詞器), token-filter(分詞過濾器)以及 analyzers(分析器)。

這就是搜索引擎對數據處理和存儲的方式,所以,通過上面的3個模塊,數據就可以被輕鬆快速的查找。

下面討論下, tokenizers(分詞器), token-filter(分詞過濾器)以及 analyzers(分析器)是如何工作的?

Tokenizers(分詞器)

分詞,就是將一個字符串,按照特定的規則打散爲多個小的字符串的過程,按照專業術語說法就是就是打散爲token(符號)。

舉個例子:

Whitespace tokenizer (空格分詞器)
空格分詞器將字符串,基於空格來打散。
還有很多其他的分詞器,比如Letter tokenizer(字母分詞器),字母分詞器遇到非字母類型的符號,然後打散字符串。
例如:

Input => “quick 2 brown’s fox “
Output => [quick,brown,s,fox]

它僅僅保留字母,並且一處所有特殊字符以及數字,所以叫做字母分詞器。

Token Filters(字符過濾器)

字符過濾器 ,是操作分詞器處理後的字符結果,並且相應地修改字符。
舉個簡單的例子
Lowercase filter : 轉小寫過濾器,會將所有字符字母轉爲小寫
Input => “QuicK”
Output => “quick”

Stemmer filter:除梗過濾器,根據特定的規則(可配置),會除去單詞的一部分內容。

例子 1: 去除單詞的時態

Input => “running”
Output => “run”

例子 2: 去除複數

Input => “shoes”
Output => “shoe”
Analyzer(分析器)

分析器是分詞器和分詞過濾器的結合,可以被應用到Elasticsearch的任何字段用來分析。這裏有很多Elasticsearch內置的分析器。
在這裏插入圖片描述

這裏列舉幾個官方內置的分析器:

  1. Standard Analyzer(標準分析器)
    標準分析器是最常被使用的分析器,它是基於統一的Unicode 字符編碼標準的文本進行分割的算法,同時它也會消除所有的標點符號,將分詞項小寫,消除通用詞等。
    例如:
Input =>The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone.”
Output => [quick, brown, fox, jump, over, lazy,dog, bone]

主題:移除所有的標點符號,數字,停用詞 比如 the, s
而對於中文,標準分析器則是單字分割

在這裏插入圖片描述

  1. Whitespace Analyzer(空格分析器):空格分析器基於空格來劃分文本。它 內部使用whitespace tokenizer來切割數據.
    例如:
Input => “quick brown fox” 
Output => [quick, brown, fox]
自定義Analyzer

就上面所說,分析器是分詞器和過濾器的結合。所以,你可以按照你的需求定義你自己的分析器,從可以使用的分詞器和過濾器。
那麼如何定義呢?舉個例子

{  
   "analyzer":{  
      "my_custom_analyzer":{  
         "type":"custom",  // Define the type as custom analyzer
          "tokenizer":"standard",//Define the tokenizer 
           "filter":[  // Define the toke Filter
            "uppercase"
         ]         
      }
   }
}

上面這個分析器的設置如下:

name — my_custom_analyzer
tokenizer — standard
filter — uppercase

運行結果:

Input =>Quick Brown Fox”
Output => [QUICK, BROWN, FOX]

如下的圖,可以幫你更好地理解分析器處理數據的過程:
在這裏插入圖片描述

幾個自定義分析器的例子如下:

1 ) 帶有停用詞和同義詞的分析器
{  
   "settings":{  
      "analysis":{  
         "analyzer":{  
            "my_custom_analyzer":{  
               "type":"custom",
               "tokenizer":"standard",
               "filter":[  
                  "lowercase",
                  "english_stop",
                  "synonyms"
               ]
            }
         },
         "filter":{  
            "english_stop":{  
               "type":"stop",
               "stopwords":"_english_"
            },
            "synonym":{  
               "type":"synonym",
               "synonyms":[  
                  "i-pod, ipod",
                  "universe, cosmos"
               ]
            }
         }
      }
   }
}

運行如下:

Input => I live in this Universe
Output => [live, universe]

單詞 [I, in , this] 都是停用詞,被移除了,因爲這些詞在搜索的時候並沒有什麼用

2)帶有除梗和停用詞的分析器
{  
   "settings":{  
      "analysis":{  
         "analyzer":{  
            "my_custom_analyzer":{  
               "type":"custom",
               "tokenizer":"standard",
               "filter":[  
                  "lowercase",
                  "english_stop",
                  "english_stemmer"
               ]
            }
         },
         "filter":{  
            "english_stemmer":{  
               "type":"stemmer",
               "stopwords":"english"
            },
            "english_stop":{  
               "type":"stop",
               "stopwords":"_english_"
            }
         }
      }
   }
}

運行如下:

Input =>Learning is fun”
Output => [learn, fun]

單詞 “[is]” 作爲停用詞被移除, “learning” 除梗後變爲 “learn”.

3)帶有特殊符號映射爲特定單詞的分析器
{  
   "settings":{  
      "analysis":{  
         "analyzer":{  
            "my_custom_analyzer":{  
               "type":"custom",
               "char_filter":[  
                  "replace_special_characters"
               ],
               "tokenizer":"standard",
               "filter":[  
                  "lowercase"
               ]
            }
         },
         "char_filter":{  
            "replace_special_characters":{  
               "type":"mapping",
               "mappings":[  
                  ":) => happy",
                  ":( => sad",
                  "& => and"
               ]
            }
         }
      }
   }
}

運行如下:

Input => Good weekend :)
Output => [good, weekend, happy]
Input => Pride & Prejudice
Output => [Pride, and, Prejudice]

請注意 :
這裏我們使用char_filter而不是token_filter ,因爲char_filter 在tokenizer 前會運行,因此避免了特殊字符,比如笑臉還有&連接符被後面的tokenizer 分隔開,或者token_filter移除。因此,你可以根據自己的需求來配置分析器,然後來獲取更好地搜索結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章