Elasticsearch底層是如何創建索引、分析索引的? 作為全文檢索引擎, 它又是如何對文本進行分詞的? 分詞是否支持自定義? 本篇介紹這些概念. ...
目錄
1 索引分析
索引分析: 將文本塊按照一定的策略分解, 並建立倒排索引的過程. 這個過程由分析器(analyzers)完成.
1.1 分析器的組成
① 字元過濾器(character filter): 去除HTML標簽, 或轉換"&"為"and"等.
② 分詞器(tokenizer): 按照某種規律, 如根據空格、逗號等, 將文本塊進行分解.
③ 標記過濾器(token filter): 所有被分詞器分解的詞都將經過token filters的處理, 它可以修改詞(如小寫化處理)、去掉詞(根據某一規則去掉無意義的詞, 如"a", "the", "的"等), 增加詞(如同義詞"jump"、"leap"等).
註意: 人們一般將分析器通稱為分詞器, 並不是相等的關係, 而是包含的關係.
1.2 倒排索引核心原理-normalization
建立倒排索引時, 會執行 normalization(正常化)操作 —— 將拆分的各個單詞進行相應的處理, 以提高搜索時命中相關聯的文檔的概率.
normalization的方式有: 時態轉換, 單複數轉換, 同義詞轉換, 大小寫轉換等.
比如: 文檔中包含 "mom likes small dogs", 在建立索引時通過normalization處理, 通過 "mother liked little dog" 也能搜索到相關的文檔.
2 ES的預設分析器
(1) ES中的預設分析器: standard tokenizer, 標準分析器, 以單詞為邊界進行分詞. 具有如下功能:
standard token filter: 去掉無意義的標簽, 如<>, &, - 等.
lowercase token filter: 將所有字母轉換為小寫字母.
stop token filer(預設被禁用): 移除停用詞, 比如"a"、"the"等.
(2) 測試預設分析器:
GET _analyze // ES引擎中已有standard分詞器, 所以可以不指定index
{
"analyzer": "standard",
"text": "There-is a DOG<br/> in house &"
}
3 修改分詞器
(1) 創建索引後可以添加新的分詞器, 添加之前必須先關閉索引, 添加之後再打開:
// 先關閉索引:
POST address/_close
// 啟用English停用詞token filter
PUT address/_settings
{
"analysis": {
"analyzer": {
"my_token_filter": { // 自定義的分詞器名稱
"type": "standard",
"stopwords": "_english_"
}
}
}
}
// 打開索引:
POST address/_open
(2) 使用具有停詞功能的分詞器進行分詞:
GET address/_analyze
{
"analyzer": "my_token_filter",
"text": "There-is a DOG<br/> in house &"
}
(3) 返回結果減少了停用詞:
{
"tokens": [
{
"token": "dog",
"start_offset": 11,
"end_offset": 14,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "br",
"start_offset": 15,
"end_offset": 17,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "house",
"start_offset": 23,
"end_offset": 28,
"type": "<ALPHANUM>",
"position": 6
}
]
}
4 定製分詞器
4.1 向索引中添加自定義的分詞器
註意: 要先關閉索引, 再添加, 然後再打開索引.
PUT address/_settings
{
"analysis": {
"char_filter": {
"&_to_and": {
"type": "mapping",
"mappings": ["&=> and"]
}
},
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": ["the", "a"]
}
},
"analyzer": {
"my_analyzer": { // 自定義的分析器名稱
"type": "custom",
"char_filter": ["html_strip", "&_to_and"], // 跳過HTML標簽, 將&符號轉換為"and"
"tokenizer": "standard",
"filter": ["lowercase", "my_stopwords"] // 轉換為小寫
}
}
}
}
4.2 測試自定義分析器
GET address/_analyze
{
"analyzer": "my_analyzer",
"text": "There-is a DOG<br/> in house &"
}
響應結果中已經對大寫單詞、HTML標簽, 以及"&"做了處理. 鑒於篇幅所限, 這裡省去.
4.3 向映射中添加自定義的分析器
PUT address/_mapping/province
{
"properties": {
"content": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
此時查看mapping信息:
GET address/_mapping
發現自定義的分析器已經配置到province上了:
{
"address": {
"mappings": {
"province": {
"properties": {
"content": {
"type": "text",
"analyzer": "my_analyzer"
},
"description": {
"type": "text"
}
}
}
}
}
}
版權聲明
作者: ma_shoufeng(馬瘦風)
出處: 博客園 馬瘦風的博客
您的支持是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段聲明, 且在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.