ElasticSearch Analyzer 分析器
阿新 • • 發佈:2022-03-22
目錄
簡介
做全文搜尋就需要對文件分析、建索引。從文件中提取詞元(Token)的演算法稱為分詞器(Tokenizer),在分詞前預處理的演算法稱為字元過濾器(Character Filter),進一步處理詞元的演算法稱為詞元過濾器(Token Filter),最後得到詞(Term)。這整個分析演算法稱為分析器(Analyzer)。
分析器有3部分構成:
-
character filters
- tokenizers(分詞器):字串被分詞器分為單個的詞條。一個簡單的分詞器遇到空格和標點的時候,可能會將文字拆分成詞條;
- token filters(分詞過濾器):接收分詞器的處理結果,並可以將切分好的詞語進行加工和修改,進而對分詞結果進行規範化、統一化和優化處理。
Analyzer處理流程:
Analyzer按順序做三件事:
- 使用CharacterFilter過濾字元;
- 使用Tokenizer分詞;
- 使用TokenFilter過濾詞。
DEMO
PUT /common_index { "settings": { "analysis": { "analyzer": { "common_analyzer": { // 自定義分析器 "char_filter": ["html_strip"], // 字元過濾器 "tokenizer": "standard", // 分詞器 "filter": ["lowercase"] // 分詞過濾器 } } } } }
它完成以下工作:
- 使用
html_strip
字元過濾器,移除html標籤; - 使用
standard
分詞器分詞; - 使用
lowercase
詞過濾器,轉為小寫單詞。
character filters(字元過濾器)
字元過濾器是分析器處理文字資料的第一道工序,它接收原始的字元流,對原始字元流中的字元進行新增、刪除或者轉換操作,進而改變原始的字元流。
ES內建的字元過濾器:
名稱 | 功能 |
---|---|
對映關係字元過濾器 | 根據配置的對映關係替換字元 |
HTML擦除過濾器 | 去掉HTML元素 |
正則表示式替換過濾器 | 用正則表示式處理字串 |
tokenizers(分詞器)
分詞器對文字進行切分後,需要保留詞語與原始文字之間的對應關係,因此分詞器還負責記錄每個Token的位置,以及開始和結束的字元偏移量。
ES內建的分詞器:
名稱 | 功能 |
---|---|
標準分詞器 | 對英文分詞時,基於語法分詞;對中文分詞時,切分成單字 |
字母分詞器 | 使用非字母的字元作為分詞標記 |
小寫分詞器 | 功能上等同於字母分詞器,並且把所有分詞結果轉換為小寫形式 |
空格分詞器 | 使用空格作為分詞標記 |
token filters(分詞過濾器)
ES內建的分詞過濾器:
名稱 | 功能 |
---|---|
Lower Case過濾器 | 將所有字母轉換成小寫形式 |
Stop Token過濾器 | 將停用詞從分詞結果中移除 |
同義詞分詞過濾器 | 為分詞結果新增同義詞 |
分析器的使用
測試分析API
通過analyze檢視搜尋關鍵詞的分析結果:
POST /_analyze
{
"analyzer": "ik_smart",
"text": "測試結果"
}
執行結果:
{
"tokens" : [
{
"token" : "測試",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "結果",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 1
}
]
}
自定義分析器
手機號分詞器:
PUT /mobile_index
{
"settings": {
"analysis": {
"char_filter": {
"digits_only": {
"type": "pattern_replace",
"pattern": "[^\\d]"
}
},
"tokenizer": {
"comm_number_tokenizer": {
"type": "ngram",
"token_chars": [
"digit"
],
"min_gram": "4",
"max_gram": "5"
}
},
"analyzer": {
"number_analyzer": {
"char_filter": "digits_only",
"tokenizer": "comm_number_tokenizer"
}
}
}
},
"mappings": {
"properties": {
"phone_number": {
"type": "text",
"analyzer": "number_analyzer"
}
}
}
}