面试题答案
一键面试索引设置
- 字段类型选择:根据数据实际情况,选择合适的字段类型。例如,对于不需要进行全文检索的字段,设置为
keyword
类型,避免不必要的分词操作。比如商品的 SKU 码,作为精确匹配字段,设为keyword
。 - 索引分片与副本:合理分配分片和副本数量。分片数量过多会增加搜索时的开销,过少则不利于数据的分布式存储和负载均衡。一般根据数据量和集群规模来确定,如数据量较小的测试环境可以设置较少分片,生产环境根据预估数据量动态调整。副本数量主要用于提高可用性和读性能,但过多副本会占用过多资源,通常设置1 - 2个副本。
- 映射设置:对字段进行恰当的映射定义。比如设置
index
为false
来避免对某些字段索引,从而减少索引空间和构建索引时间。对于日期字段,指定合适的日期格式,确保高效的日期范围查询。
分词器选择
- 通用分词器:对于英文文本,
standard
分词器是默认且常用的,它能较好地处理英文单词的分隔。对于中文文本,ik
分词器是广泛使用的,ik_smart
分词粒度较粗,适用于对性能要求较高、对分词精度要求不是特别高的场景;ik_max_word
分词粒度更细,适用于对分词精度要求较高的场景。例如,在电商搜索商品描述时,若用户输入的关键词较简短,可使用ik_smart
;若用户输入长文本,想获取更多相关结果,可使用ik_max_word
。 - 自定义分词器:根据业务需求,定制分词规则。可以基于现有的分词器进行扩展,比如在
ik
分词器基础上添加业务领域的专有词汇,以提高对特定词汇的识别和分词效果。例如在医疗领域,添加医学专业术语到自定义词典供分词器使用。
数据预处理
- 文本清洗:在数据索引之前,去除文本中的噪声数据,如 HTML 标签、特殊字符、停用词等。例如在爬取网页内容进行索引时,先使用正则表达式去除 HTML 标签,使用停用词表去除像 “的”“是”“在” 等无实际检索意义的词,从而减少索引数据量,提高检索效率。
- 数据标准化:对数据进行统一格式处理,比如将所有文本转换为小写,或者统一日期格式等。这样可以避免因格式差异导致的检索不准确或效率低下。例如,将所有英文文本转换为小写后再进行索引,用户检索时无论输入大写还是小写都能匹配到相应结果。
查询优化
- 布尔查询结构:合理组织布尔查询中的
must
、should
、filter
等子句。filter
子句不会计算文档的相关性分数,仅用于过滤文档,性能较高。例如在电商搜索中,先使用filter
子句过滤掉已下架商品,再使用must
子句匹配用户输入的关键词,这样可以减少参与相关性计算的文档数量,提高查询效率。 - 使用缓存:利用 ElasticSearch 的查询缓存机制,对于经常查询的结果进行缓存。例如在网站热门搜索词的查询中,将热门搜索词的结果缓存起来,当相同查询再次出现时,直接从缓存中返回结果,减少查询处理时间。