文章目錄
- 一、主分詞器:最基礎的文本處理單元
- 主分詞器的作用
- 典型主分詞器示例
- 二、其他類型的分詞器:解決主分詞器的局限性
- 1. 子字段分詞器(Multi-fields)
- 2. 搜索分詞器(Search Analyzer)
- 3. 自定義分詞器(Custom Analyzer)
- 4. 專能分詞器(Specialized Tokenizers)
- 三、為什么需要多種分詞器?
- 總結
在 Elasticsearch(ES)中, 分詞器(Analyzer) 是將文本拆分為可檢索詞元(Token)的核心組件。其中“主分詞器”是最基礎的類型,但為了滿足多樣化的文本處理需求,ES 還支持多種其他類型的分詞器。以下從定義、分類、典型場景三個維度詳細說明:
一、主分詞器:最基礎的文本處理單元
主分詞器是 ES 中默認用于索引和搜索階段的分詞器,負責將原始文本(如中文句子、英文段落)拆分為最小可檢索的詞元(Token)。它是每個 text
類型字段的“核心處理器”,決定了文本的基礎拆分邏輯。
主分詞器的作用
- 索引階段:將文檔內容(如“北京天安門”)拆分為詞元(如
北京
、天安門
),寫入倒排索引。 - 搜索階段:將用戶輸入的查詢詞(如“天安門”)拆分為詞元(如
天安門
),與索引中的詞元匹配。
典型主分詞器示例
- 中文場景:
ik_max_word
(細粒度拆分,如“人工智能”→人工
、智能
、人工智能
)。 - 英文場景:
standard
(標準分詞器,按空格和標點拆分,轉小寫)。 - 日文場景:
kuromoji
(基于日語詞法分析的分詞器)。
二、其他類型的分詞器:解決主分詞器的局限性
主分詞器雖能處理基礎需求,但面對復雜場景(如多語言混合、拼音檢索、模糊匹配)時,需要其他類型的分詞器補充。ES 支持以下幾類“非主分詞器”:
1. 子字段分詞器(Multi-fields)
通過 fields
屬性為同一個字段創建多個子字段,每個子字段使用不同的分詞器,滿足不同查詢需求。
核心價值:一個字段支持多種拆分方式(如漢字、拼音、全拼)。
示例(中文+拼音混合索引):
{"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_max_word", // 主分詞器(處理漢字)"fields": {"pinyin": { // 子字段(處理拼音)"type": "text","analyzer": "pinyin_analyzer"},"keyword": { // 子字段(保留原文,用于精確匹配)"type": "keyword"}}}}}
}
- 主字段
title
:用ik_max_word
拆分漢字(如“中國”→中國
)。 - 子字段
title.pinyin
:用拼音分詞器拆分(如“中國”→zhong
、guo
、z
、g
)。 - 子字段
title.keyword
:用keyword
分詞器(不拆分,保留原文“中國”)。
2. 搜索分詞器(Search Analyzer)
通過 search_analyzer
顯式指定搜索階段使用的分詞器(與索引階段的主分詞器不同)。
核心價值:解決“索引時細粒度拆分,搜索時粗粒度匹配”的矛盾。
典型場景:
索引時用 ik_max_word
(細粒度,如“北京大學”→北京
、大學
、北京大學
),搜索時用 ik_smart
(粗粒度,如用戶輸入“北大”→北大
)。此時需用 search_analyzer
確保搜索詞拆分與索引詞元匹配。
配置示例:
{"mappings": {"properties": {"content": {"type": "text","analyzer": "ik_max_word", // 索引分詞器(細粒度)"search_analyzer": "ik_smart" // 搜索分詞器(粗粒度)}}}
}
3. 自定義分詞器(Custom Analyzer)
通過組合 字符過濾器(Char Filter)
、分詞器(Tokenizer)
、詞元過濾器(Token Filter)
自定義分詞邏輯,滿足特定業務需求。
核心價值:靈活處理特殊文本(如去除HTML標簽、保留數字范圍)。
組成結構:
analyzer: {char_filter: [ ... ], # 預處理文本(如替換特殊符號)tokenizer: ..., # 拆分文本為詞元(核心)filter: [ ... ] # 過濾/修改詞元(如轉小寫、去停用詞)
}
示例(處理英文+數字混合文本):
{"settings": {"analysis": {"analyzer": {"custom_analyzer": {"char_filter": ["html_strip"], # 去除HTML標簽"tokenizer": "standard", # 按空格/標點拆分"filter": ["lowercase", # 轉小寫"asciifolding", # 轉換特殊字符(如é→e)"stop" # 去除停用詞(如the、and)]}}}}
}
4. 專能分詞器(Specialized Tokenizers)
ES 內置了多種針對特定場景的分詞器,無需自定義即可直接使用:
keyword
分詞器:不拆分文本,將整個字符串作為一個詞元(用于精確匹配,如品牌名、ID)。pattern
分詞器:按正則表達式拆分(如按-
拆分“2023-05-11”→2023
、05
、11
)。ngram
分詞器:生成連續字符組合(如“蘋果”→蘋
、果
、蘋果
),用于模糊搜索(如輸入“蘋”召回“蘋果”)。path_hierarchy
分詞器:按層級拆分路徑(如“/a/b/c”→/a
、/a/b
、/a/b/c
),用于目錄結構檢索。
三、為什么需要多種分詞器?
主分詞器是基礎,但單一分詞器無法滿足所有需求:
- 多維度檢索:用戶可能用漢字、拼音、首字母搜索同一內容(需子字段分詞器)。
- 精度與性能平衡:索引時細粒度拆分(提升召回),搜索時粗粒度拆分(提升性能,需搜索分詞器)。
- 特殊文本處理:如去除HTML標簽、保留數字范圍(需自定義分詞器)。
- 跨語言支持:中文用
ik
,英文用standard
,日文用kuromoji
(需不同主分詞器)。
總結
主分詞器是 ES 中最基礎的分詞器,負責索引和搜索的默認文本處理。但為了應對復雜場景,ES 還支持子字段分詞器(多維度檢索)、搜索分詞器(精度與性能平衡)、自定義分詞器(特殊文本處理)和專能分詞器(特定場景)。理解這些類型的核心差異,能幫助你根據業務需求(如召回率、準確性、性能)選擇合適的分詞方案。