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內置的分析器。
這裏列舉幾個官方內置的分析器:
- 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
而對於中文,標準分析器則是單字分割
- 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移除。因此,你可以根據自己的需求來配置分析器,然後來獲取更好地搜索結果。