清晨六点,小E的中餐厅后厨已经忙活开了。开业第一天,客人点了一份“红烧肉”,后厨的助手们却不识字——他们只见过菜单上的汉字,却不知道“红烧肉”是一个完整的词。于是客人等来三碟菜:一碟“红”、一碟“烧”、一碟“肉”。客人目瞪口呆:“我要的是一道菜,不是三个字!”后来,小E请来了一位精通中文的大厨。大厨接过菜单,一刀切中要害——“红烧肉”出锅,客人竖起大拇指。 这位大厨,就是搜索引擎里的分词器(Analyzer)。Elasticsearch,这个在NoSQL数据库家族中最耀眼的“文档与搜索”明星,无论存什么文档,都要先经过分词器这道“后厨流水线”,把一句话切成一粒粒“词条”,才能建立索引、响应搜索。分词质量好不好,直接决定了你搜“北京天安门”,端出来的是一盘“北京烤鸭”还是满桌“北”“京”“天”的残羹。

岗位关联

学会分词,你就握住了搜索召回率的钥匙。无论做站内搜索、日志分析还是AI知识库检索,配置好Analyzer都是让搜索结果“精准对味”的基本功。

目录
  1. 可视化演示
  2. 分词器概念:后厨里的主厨
  3. 三阶段流水线:洗菜、切菜、挑菜
  4. 标准分词器:进口切菜机的局限
  5. IK中文分词:中餐大师傅的刀工
  6. 拼音分词器:给菜单加拼音标签
  7. 同义词与停用词:别名登记与禁点清单
  8. 分词与搜索质量:切割粒度决定成败
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

分词器概念:后厨里的主厨

小E的餐厅刚开业时闹了个大笑话。客人点“红烧肉”,后厨助手们不识字,只知道一个字一个字地切,端上来“红”“烧”“肉”三碟菜。客人一脸茫然:“我要的是一道菜,不是三碟字。”后来小E请了一位懂中文的主厨,主厨看一眼菜单,手起刀落,端出一盘热腾腾的红烧肉。这位主厨,就是Elasticsearch里的分词器(Analyzer)。

在Elasticsearch中,分词器负责把文档和查询语句切分成一个一个的词条(Token)。这些词条会被记录进倒排索引——一张“词→文档”的映射表。检索时,查询语句也被切分成词条,再到倒排索引里找匹配的文档。倒排索引就像餐厅的“菜品索引卡”:每张卡上写着“红烧肉”对应哪些桌的客人在等。分词器就是这张索引卡的编写者,词条写得好不好,直接决定顾客能否被正确“投喂”。

Elasticsearch的底层是Lucene,Analyzer是Lucene的核心组件。一个完整的Analyzer由字符过滤器(CharFilter)、分词器(Tokenizer)和词条过滤器(TokenFilter)三部分组合而成。字符过滤器负责清洗原始文本,分词器负责切分,词条过滤器负责筛选改写。三者协同配合,缺一不可。

主厨的技术高低,决定了菜品的切配质量。分词器也一样——它的水平决定了Elasticsearch对文本的理解深度。一个理解不了“红烧肉”的搜索引擎,跟只会切“红”“烧”“肉”的助手没什么两样。

Analyzer=CharFilter+Tokenizer+TokenFilter\displaystyle \text{Analyzer} = \text{CharFilter} + \text{Tokenizer} + \text{TokenFilter}
这个公式告诉你,分词器不是“一个切菜动作”,而是一条完整的后厨流水线——清洗、切配、筛选各有专人负责。
  1. Analyzer 分词器整条流水线的总称,它是一个可配置的组合体
    Analyzer\text{Analyzer}
  2. CharFilter 字符过滤器负责清洗原始文本,可配置0个或多个
    CharFilter\text{CharFilter}
  3. Tokenizer 分词器负责把文本切成词条,只能配置1个
    Tokenizer\text{Tokenizer}
  4. TokenFilter 词条过滤器负责筛选和改写词条,可配置0个或多个
    TokenFilter\text{TokenFilter}

三阶段流水线:洗菜、切菜、挑菜

真正的大厨做菜不是一个人包揽所有环节。后厨有明确的分工:帮工先洗菜、摘掉烂叶(字符过滤);大厨亲自把菜切成均匀薄片(分词);最后帮工再挑出肥肉、筛掉碎渣(词条过滤)。Elasticsearch的分词器,就是这一条标准的三段式流水线。

这套流水线在Elasticsearch里被抽象为三个组件,它们依次作用于文本:Character Filters(字符过滤器)、Tokenizer(分词器)、Token Filters(词条过滤器)。每个环节的输出是下一个环节的输入。理解这条流水线,你就能看懂任何Analyzer的内部结构,无论是内置的standard还是自定义的ik+pinyin组合。

字符过滤器(CharFilter)处理原始字符:删除HTML标签、把正则匹配到的内容替换掉。它有“0个或多个”的配置灵活性,按配置顺序执行。分词器(Tokenizer)是整条流水线的核心,它把清洗后的文本切成词条,一个Analyzer里只能有一个。词条过滤器(TokenFilter)处理词条:改成小写、去停用词、加同义词、做拼音转换,可以有“0个或多个”。

洗菜、切菜、挑菜,缺一环都出不了好菜。分词流水线里任何一环处理不当,进入倒排索引的词条就不够干净,搜索效果自然大打折扣。

Text→CharFilterCleanText→TokenizerTokens→TokenFilterIndexTerms\displaystyle \text{Text} \xrightarrow{\text{CharFilter}} \text{CleanText} \xrightarrow{\text{Tokenizer}} \text{Tokens} \xrightarrow{\text{TokenFilter}} \text{IndexTerms}
文本经过三次接力传递,最终变成写入倒排索引的“成品词条”。每一步都在给下一步做铺垫。
  1. Text 原始文本用户输入或文档中的原始字符串
    Text\text{Text}
  2. CleanText 清洗后文本经过字符过滤后的干净文本
    →CharFilterCleanText\xrightarrow{\text{CharFilter}} \text{CleanText}
  3. Tokens 词条序列经过分词器切分后的词条列表
    →TokenizerTokens\xrightarrow{\text{Tokenizer}} \text{Tokens}
  4. IndexTerms 索引入口词条经过过滤后最终进入倒排索引的词条
    →TokenFilterIndexTerms\xrightarrow{\text{TokenFilter}} \text{IndexTerms}

标准分词器:进口切菜机的局限

小E从西餐厅借来一台进口切菜机——标准分词器。这台机器对西餐得心应手:空格的地方下刀,标点的地方停下,还会顺手把大写字母改成小写。可是把它搬到中餐厨房,它立刻傻了眼:中文没有空格,它只好一个字一个字地切。

标准分词器(Standard Analyzer)是Elasticsearch的默认配置,由Standard Tokenizer和Lowercase Token Filter组成。对英文,“I Love Beijing“会被切成 i、love、beijing;但对中文”我爱北京”,它只会切成 我、爱、北、京 四个单字。为什么对中文失效?因为中文词与词之间没有空格,而标准分词器依赖Unicode文本分割算法,默认把连续汉字切成单个字符。

这样带来的后果是:“北京”不会作为一个整体词条出现,搜索“北京”时只能分别匹配“北”和“京”,召回了一堆包含“北”或“京”的无关文档。标准分词器适合英文及空格分隔的语言,对于中文场景,需要替换为专门的中文分词器。

这台进口切菜机不是不好,只是不擅长中餐。如果文档以英文为主,用标准分词器完全够用;但中文场景下,你需要请一位真正懂中文的大厨——IK分词器。

Standard(我爱北京)={我,爱,北,京}\displaystyle \text{Standard}(\text{我爱北京}) = \{\text{我}, \text{爱}, \text{北}, \text{京}\}
标准分词器把“我爱北京”切成四个单字,它不理解“北京”是一个完整的地理名词。
  1. Standard 标准分词器ES默认的通用分词方案
    Standard\text{Standard}
  2. 输入“我爱北京”一句没有空格分隔的中文
    我爱北京\text{我爱北京}
  3. 切分结果得到四个独立的单字词条
    {我,爱,北,京}\{\text{我}, \text{爱}, \text{北}, \text{京}\}

IK中文分词:中餐大师傅的刀工

为了让中文切得准,小E请来了中餐大师傅IK。IK师傅手里有一本厚厚的《中华菜谱》(主词典),里面收录了几十万个中文词汇。切菜时,他先用菜谱把句子里的词都勾出来,然后问你要“细切”还是“整切”。

IK分词器(IK Analyzer)是Elasticsearch中最流行的中文分词插件。它基于词典做最大匹配切分,并支持两种模式:ik_max_word和ik_smart。前者从句子中枚举出所有可能的词汇组合,适用于索引阶段——文档切得细,搜索词更容易命中;后者只保留最合理的切分方案,适用于查询阶段——查询词更精准,减少误匹配。

在Elasticsearch中配置IK,可以通过analysis-ik插件安装并自定义Analyzer。此外,IK支持自定义词典:把公司名、产品名、专业术语加进词典文件,IK就能识别这些“私房菜名”,避免把“蔚来汽车”切成“蔚/来/汽/车”。

IK师傅就是中文搜索的定海神针。索引阶段用max_word保召回,查询阶段用smart保精准,再配合自定义词典加入业务词汇,这套组合拳是中文搜索的标配打法。

ik_max_word(北京天安门)={北京,天安,天安门}\displaystyle \text{ik\_max\_word}(\text{北京天安门}) = \{\text{北京}, \text{天安}, \text{天安门}\}
ik_smart(北京天安门)={北京,天安门}\displaystyle \text{ik\_smart}(\text{北京天安门}) = \{\text{北京}, \text{天安门}\}
同上两行公式展示细切与整切的区别:max_word枚举尽量多的词,smart只保留最合理的词。
  1. ik_max_word 细切模式枚举所有可能的词组合,索引阶段常用
    ik_max_word(北京天安门)={北京,天安,天安门}\text{ik\_max\_word}(\text{北京天安门}) = \{\text{北京}, \text{天安}, \text{天安门}\}
  2. ik_smart 智能模式只保留语义最连贯的切分,查询阶段常用
    ik_smart(北京天安门)={北京,天安门}\text{ik\_smart}(\text{北京天安门}) = \{\text{北京}, \text{天安门}\}

拼音分词器:给菜单加拼音标签

餐厅里来了一位外国客人,他知道“红烧肉”毛色通红、入口即化,却死活想不起这三个字怎么写。小E一拍脑门:给菜单加上拼音标签不就行了!拼音分词器就是这台“拼音标签机”。

拼音分词器(Pinyin Analyzer)把中文词条转换成拼音,让用户输入拼音也能搜到中文文档。它通常作为TokenFilter挂载在自定义Analyzer中,与IK分词器组合使用:IK先切词,拼音过滤器再为每个词条生成拼音变体。

常见的拼音配置有三种粒度:全拼(beijing)、首字母(bj)、混合保留(同时保留“北京”"beijing"“bj“)。全拼适合完整的拼音输入,首字母适合搜索建议——比如用户在搜索框输入”bj“,下拉列表自动补全”北京“。配置时需注意让原中文词条与拼音词条同时保留,这样”北京”"beijing""bj"三种输入都能命中同一文档。

有了拼音标签,客人不会写字也能点菜。拼音分词器拓宽了中文搜索的入口,让“只会念、不会写”的用户也能找到想要的内容——这是提升搜索体验的隐形助攻。

Pinyin(北京)={beijing,bj}\displaystyle \text{Pinyin}(\text{北京}) = \{\text{beijing}, \text{bj}\}
拼音转换器把一个中文词条映射成多个拼音形式,相当于给每个词条挂上多张“拼音名片”。
  1. Pinyin 拼音转换器将中文词条转换为拼音形式
    Pinyin(北京)\text{Pinyin}(\text{北京})
  2. beijing 全拼完整的拼音,用于精确拼音搜索
    beijing\text{beijing}
  3. bj 首字母缩写拼音首字母,用于快速输入和搜索建议
    bj\text{bj}

同义词与停用词:别名登记与禁点清单

“番茄炒蛋”和“西红柿炒蛋”在菜单上是两个名字,实质上却是一道菜。小E想:如果客人搜“西红柿”,后厨也能端出“番茄炒蛋”就好了。于是他给菜做了别名登记——同义词。反过来,“的”“了”这些词就像葱姜蒜,是调味品但不是主菜,没人会单独点一盘“大蒜”。于是他又设置了禁点清单——停用词。

同义词处理(Synonym Token Filter)把含义相同或相近的词语映射成同一组,让不同叫法都能命中相同文档。在Elasticsearch中,配置同义词只需在settings里定义一个synonym过滤器:"番茄,西红柿"表示两者等价。索引时,“西红柿”会被扩展成“西红柿、番茄”两个词条;查询时同样扩展,于是任何一方都能命中相关内容。

相反,停用词处理(Stop Token Filter)把“的”“了”“在”这类高频但无实义的词从索引中移除。这就像后厨的“禁点清单”:葱姜蒜虽然做菜时会用到,但不会作为独立菜品出现在菜单上。移除停用词可以显著缩小索引体积、提升查询性能,同时保证搜索质量不下降。

别名登记让客人怎么说都能点到菜,禁点清单把后厨的精力集中在真正的菜品上。同义词扩大搜索覆盖面,停用词保证索引干净高效——两者配合,搜索才能又快又准。

Synonym(西红柿)={西红柿,番茄},Stop(的)=∅\displaystyle \text{Synonym}(\text{西红柿}) = \{\text{西红柿}, \text{番茄}\}, \quad \text{Stop}(\text{的}) = \varnothing
同义词做加法——把等价词都纳入索引;停用词做减法——把无实义词从索引中剔除。
  1. Synonym 同义词扩展将“西红柿”扩展为包含等价词的集合
    Synonym(西红柿)={西红柿,番茄}\text{Synonym}(\text{西红柿}) = \{\text{西红柿}, \text{番茄}\}
  2. Stop 停用词移除将高频无意义词从索引中删除,对应空集
    Stop(的)=∅\text{Stop}(\text{的}) = \varnothing

分词与搜索质量:切割粒度决定成败

切菜的粒度直接影响上菜速度和质量。切得太细,客人点“红烧肉”,后厨端出“红”“烧”“肉”三碟配料;切得太粗,红烧肉和红烧排骨混为一锅。搜索引擎面临同样的抉择:切得细,找得多但噪音大;切得粗,切得准但漏得多。

在信息检索领域,有两个核心指标:召回率(Recall)和精准率(Precision)。召回率衡量“相关文档被找回来的比例”,精准率衡量“找回来的文档中相关文档的比例”。分词粒度直接影响这两个指标的平衡:ik_max_word细切分让词条更多,搜索时更不容易漏掉文档——召回率上升;但细切分也引入噪音词条,误召回不相关文档——精准率下降。粗切分则相反。

工程上的标准做法是“索引细切、查询粗切”:索引阶段用ik_max_word保召回,查询阶段用ik_smart保精准,再配合同义词扩展和拼音分词器覆盖更多输入形式,在召回与精准之间找到业务需要的平衡点。

搜索引擎的终极目标,是客人说一半你就能端出对的那道菜。分词器的选择、同义词的扩展、停用词的过滤,每一项都在为这个目标添砖加瓦。理解了分词,你就理解了搜索引擎的味觉起点。

Recall=∣Relevant∩Retrieved∣∣Relevant∣\displaystyle \text{Recall} = \frac{|\text{Relevant} \cap \text{Retrieved}|}{|\text{Relevant}|}
召回率是“正确的菜被端上桌”的比例。分母是厨房里所有相关菜品,分子是真正送到客人桌上的那几道。
  1. Relevant 相关文档集合所有与查询真正相关的文档
    Relevant\text{Relevant}
  2. Retrieved 检索文档集合搜索引擎实际返回的文档
    Retrieved\text{Retrieved}
  3. 交集大小检索结果中相关文档的数量
    ∣Relevant∩Retrieved∣|\text{Relevant} \cap \text{Retrieved}|
  4. 召回率相关文档被找回来的比例
    ∣Relevant∩Retrieved∣∣Relevant∣\frac{|\text{Relevant} \cap \text{Retrieved}|}{|\text{Relevant}|}

AI 应用场景

电商商品搜索

阶段:数据预处理/召回

解决的问题:用户搜“iPhone 15“但商品标题是”苹果15手机“,传统数据库的LIKE模糊查询无法匹配。用IK分词器切分商品标题,再配置同义词”苹果=iPhone“,让不同叫法都能命中同一款商品。再叠加拼音分词器,用户输入”pingguo“也能搜到”苹果”。

具体案例:某电商平台将商品搜索从MySQL迁到Elasticsearch,配置IK+同义词+拼音三重分词组合。用户输入“pingguo shouji“也能正确搜出”苹果手机”,搜索点击率提升约30%,无结果率下降一半。

ELK日志检索

阶段:日志数据清洗与索引

解决的问题:运维日志里每条message都是长文本,需要快速检索异常关键词。用Analyzer把日志切分成时间、IP、错误码等词条,再用停用词过滤掉无意义的日志噪声,让排障时的关键词查询秒级返回。

具体案例:某金融公司用ELK收集应用日志,通过自定义Analyzer将“ERROR 500 at 2024-01-01 10:00:00“切分为error=500、date、time等结构化字段。排障时搜索”ERROR 500”能立即召回全部相关日志,平均定位时间从小时级降到分钟级。

RAG知识库检索

阶段:文档分块与召回

解决的问题:RAG(检索增强生成)应用中,文档必须先被检索出来才能交给大模型回答。中文文档如果按标准分词器逐字切分,检索到的片段往往语义不连贯。用IK分词器配合同义词扩展,能大幅提升相关文档的召回命中率。

具体案例:某法律AI系统将法律条文用ik_max_word索引、查询用ik_smart配合同义词(如“合同=合约”),使问答系统的相关文档命中率从55%提升到82%,大模型生成的回答也因此更加准确。

Python 演示

python59 行
import re  class Analyzer:    """模拟Elasticsearch分词三阶段流水线"""     def __init__(self, stopwords=None, synonyms=None):        self.stopwords = stopwords or {'的', '了', '在', '我'}        self.synonyms = synonyms or {'西红柿': ['番茄'], '土豆': ['马铃薯']}        self.vocab = ['天安门', '北京', '天安', '西红柿', '番茄',                      '土豆', '马铃薯', '苹果', '手机', '爱', '吃']     def char_filter(self, text):        # 阶段1: 字符过滤, 去HTML标签和标点        text = re.sub(r'<[^>]+>', '', text)        text = re.sub(r'[!?。,,\.\!\?\s]+', ' ', text)        return text.strip()     def tokenizer(self, text):        # 阶段2: 基于词典的最长匹配切分        tokens = []        i = 0        while i < len(text):            matched = False            for word in sorted(self.vocab, key=len, reverse=True):                if text[i:i + len(word)] == word:                    tokens.append(word)                    i += len(word)                    matched = True                    break            if not matched:                tokens.append(text[i])                i += 1        return tokens     def token_filter(self, tokens):        # 阶段3: 去停用词 + 同义词扩展        result = []        for token in tokens:            if token in self.stopwords:                continue            result.append(token)            if token in self.synonyms:                result.extend(self.synonyms[token])        return result     def analyze(self, text):        clean = self.char_filter(text)        tokens = self.tokenizer(clean)        return self.token_filter(tokens)  if __name__ == '__main__':    analyzer = Analyzer()    text = '<p>我爱北京天安门,我也爱吃西红柿炒蛋。</p>'    print('原始文本:', text)    print('清洗后:', analyzer.char_filter(text))    print('切分后:', analyzer.tokenizer(analyzer.char_filter(text)))    print('过滤后:', analyzer.analyze(text))
目的:用不到60行Python实现一个简化版Elasticsearch分词器,完整演示字符过滤、词典分词、停用词移除和同义词扩展的流程。
  1. def char_filter(self, text):流水线第一站:清洗原始文本,对应Elasticsearch的CharFilter。
  2. text = re.sub(r'<[^>]+>', '', text)去掉HTML标签,相当于内置的html_strip字符过滤器。
  3. def tokenizer(self, text):流水线第二站:基于词典的最长匹配切分。
  4. for word in sorted(self.vocab, key=len, reverse=True):词典按词长降序排列,优先匹配最长词,模拟IK分词的核心思想。
  5. if token in self.stopwords: continue停用词直接丢弃,不进入索引。
  6. result.extend(self.synonyms[token])命中同义词时把等价词一并写入,实现搜索扩展。

常见误区

误区“我已经配置了IK分词器,中文搜索应该完美了,不需要再管同义词和停用词了。”

正解IK分词器只负责“切词”,它解决的是“把文本切成合理词条”的问题。但搜索还面临“同义不同词”(番茄 vs 西红柿)和“无意义高频词”(的、了)的挑战。就像切菜师傅刀工再好,也不能凭空解决“同一道菜两种叫法”的菜单混乱。切词、同义词、停用词是三个独立维度,需要分别配置。

为何常见:初学者看到IK能正确切分中文,就以为解决了所有问题,忽略了搜索链路上的其他环节。

误区“把所有的虚词、代词、副词都加进停用词表,索引更小,搜索更快,效果更好。”

正解过度删停用词会破坏语义。比如搜索“三国演义”,如果把“三”设为停用词,“三国演义”这个词条就永远无法被检索到。更极端的例子,“北京大学”如果把“北京”当停用词,就再也搜不到这所学校了。停用词只应该剔除那些“对检索意图完全没有贡献”的虚词,需要结合语料统计谨慎挑选。

为何常见:搜索引擎的“去噪音”概念容易让人误以为删得越多越干净,忽略了词条本身可能就是搜索关键词。

误区“ik_max_word切分得最细,召回率最高,所以索引和查询都用ik_max_word准没错。”

正解细切分会引入大量噪音词条。比如“天安门”被切成“天安门/天安/安门”,用户搜索“安”也能匹配“天安门”,但“安”并不是用户想要的。结果就是召回率上去了,精准率却一落千丈。工程上通常索引用max_word、查询用smart,兼顾召回与精。

为何常见:只看召回率、忽略精准率,是评估搜索效果时最常见的偏差。

误区“多多配置同义词,把各种可能的口语叫法都加进去,搜索覆盖面越大越好。”

正解同义词会显著扩大索引体积,且可能把语义不同的词强行等价。比如“苹果”和“Apple“在电子产品话题下是同义,但在水果话题下是两个东西。盲目配置同义词会导致搜索结果”答非所问”。同义词必须结合业务场景、按语义边界谨慎配置。

为何常见:没有意识到同义词扩展的代价是索引体积膨胀和语义漂移风险。

面试题

Q1. Elasticsearch中Analyzer的核心职责是什么?

单选题 · easy

  • A.负责存储文档数据
  • B.负责切分词条文本← 正确答案
  • C.负责管理集群节点
  • D.负责规定分片数量

答案:B。Analyzer(分词器)的核心职责是分析文本并切分成词条(Token),这是建立倒排索引和查询匹配的基础。存储数据、管理集群、规定分片都是Elasticsearch其他组件的职责。就像主厨负责切菜,不负责端盘子。

Q2. 一个Analyzer能配置的Tokenizer数量是多少?

单选题 · easy

  • A.不需要任何配置
  • B.只能配置一个← 正确答案
  • C.可配置多个组件
  • D.由词典大小决定

答案:B。一条分词流水线里只能有一个Tokenizer(分词器),因为多个分词器同时切分会造成词条边界混乱。就像一条切菜流水线上只有一把主刀,不可能同时用两把刀切同一根黄瓜。字符过滤器和词条过滤器可以配多个,但分词器只有一个。

Q3. 标准分词器处理中文文本的结果是什么?

单选题 · mid

  • A.按语义切分中文
  • B.逐字切分每个单字← 正确答案
  • C.按空格切分词语
  • D.保持句子原样不动

答案:B。标准分词器基于Unicode文本分割算法,对没有空格分隔的连续中文字符会逐个切分成单字。“我爱北京”变成“我”“爱”“北”“京”四个词条,无法识别“北京”是一个完整词汇。这也是中文场景需要IK分词器的原因。

Q4. ik_max_word分词模式最大的特点是什么?

单选题 · mid

  • A.粗粒度切分词语
  • B.细粒度枚举词条← 正确答案
  • C.仅识别单个汉字
  • D.完全不区分词语

答案:B。ik_max_word会把句子中所有可能的词汇组合都枚举出来。例如“北京天安门”切成“北京”“天安”“天安门”。这种细粒度切分召回率更高,常用于索引阶段,确保任何查询词都能命中。

Q5. 关于IK分词器的模式应用,正确说法有哪些?

多选题 · mid

  • A.索引阶段多选用细切分← 正确答案
  • B.查询阶段多选用粗切分← 正确答案
  • C.细切分比粗切分更精准
  • D.粗切分能提升搜索性能← 正确答案

答案:ABD。索引阶段用ik_max_word细切分保召回,查询阶段用ik_smart粗切分保精准,这是工程标配。选项C说反了:细切分召回高但精准低。选项D正确:粗切分产生的词条更少,索引更小,查询性能更快。

Q6. 拼音分词器在搜索中的主要价值是什么?

单选题 · mid

  • A.把中文文档翻译成英文
  • B.支持用户用拼音搜索← 正确答案
  • C.压缩中文索引的体积
  • D.把英文翻译成中文

答案:B。拼音分词器把中文词条转换成拼音(全拼或首字母),让用户输入“beijing“或”bj“也能搜到”北京”文档。它不负责翻译文档,也不压缩索引,而是拓宽了搜索入口。

Q7. 关于同义词处理,下列说法正确的有哪些?

多选题 · hard

  • A.同义词配置允许扩展查询← 正确答案
  • B.同义词会增大索引的体积← 正确答案
  • C.同义词扩展一定提升精准率
  • D.同义词只能作用于中文环境

答案:AB。同义词会把“西红柿”扩展为“西红柿、番茄”,同时应用于索引和查询,扩大了匹配覆盖面。但扩展也意味着更多词条,索引体积会增大。选项C错误:同义词提升的是召回率而非精准率。选项D错误:同义词对英文同样适用,比如“tv“和”television”。

Q8. 下列哪项不属于停用词的作用?

单选题 · easy

  • A.可以节省部分索引空间
  • B.可以提升查询响应速度
  • C.可以过滤无意义高频词
  • D.可以识别文本中的敏感词← 正确答案

答案:D。停用词(Stop Words)用于移除“的、了、在”等无实义的高频词,从而节省索引空间、提升查询速度。它不是安全组件,没有识别敏感词的功能。就像“禁点清单”只管不卖某道菜,不管查食品卫生。

Q9. 召回率衡量的是什么?

单选题 · hard

  • A.检索结果中相关文档占比
  • B.相关文档被检索出的比例← 正确答案
  • C.检索结果中无关文档的占比
  • D.索引中词条出现的频率

答案:B。召回率(Recall)= 相关且被检索到的文档数 ÷ 全部相关文档数。它衡量的是“该找回来的有没有找回来”。选项A是精准率,选项C是无关率,选项D与召回率无关。一句话记忆:召回率管“漏没漏”,精准率管“错没错”。

Q10. 提升中文搜索召回率的有效途径有哪些?

多选题 · hard

  • A.索引采用最细粒度分词← 正确答案
  • B.配置同义词进行扩展← 正确答案
  • C.过滤所有低频生僻词
  • D.增加拼音分词器支持← 正确答案

答案:ABD。ik_max_word细切分让文档词条更丰富,同义词扩展让等价词都能命中,拼音分词器让拼音输入也能匹配中文词条。选项C错误:过滤低频生僻词会损害召回率,因为生僻词往往就是用户要找的专业术语或人名地名。