面试题答案
一键面试1. 优化查询语句提升搜索性能
1.1 term查询
- 使用场景:用于精确匹配,比如匹配具体的ID、状态码等。例如在用户文档中,根据用户ID精确查找某个用户。
- 优化技巧:避免在全文本字段上使用
term
查询,因为全文本字段在索引时会进行分词,term
查询不会考虑分词情况。如果必须在全文本字段上进行精确匹配,可以考虑使用keyword类型的字段。
1.2 match查询
- 使用场景:用于文本字段的模糊匹配,它会对查询字符串进行分词,然后在倒排索引中查找匹配的文档。常用于搜索文章标题、正文等文本内容。
- 优化技巧:
- 调整分析器:选择合适的分析器,确保对查询字符串和文档中的文本以一致且有效的方式进行分词。例如,对于英文文本,
english
分析器可能比标准分析器更适合处理英文单词的词干提取等。 - 控制查询词数量:过多的查询词可能导致匹配范围过大,降低性能。可以通过一些业务逻辑,如根据用户输入的长度动态调整查询词数量。
- 调整分析器:选择合适的分析器,确保对查询字符串和文档中的文本以一致且有效的方式进行分词。例如,对于英文文本,
1.3 bool查询
- 使用场景:组合多个查询条件,实现复杂的逻辑组合,如
must
(必须满足)、should
(应该满足)、must_not
(必须不满足)等。常用于同时满足多个条件的复杂搜索,例如搜索价格在一定范围内且品牌为特定品牌的商品。 - 优化技巧:
- 合理组织条件:将过滤性强的条件放在
must
子句中,这样可以在早期快速减少匹配的文档数量。例如,在搜索电商商品时,先根据库存大于0(must
条件)过滤,再根据其他可选条件(should
条件)进一步筛选。 - 减少
should
子句数量:过多的should
子句会增加查询的复杂度和计算量,尽量合并相似条件或者根据业务重要性进行排序,优先使用重要的should
条件。
- 合理组织条件:将过滤性强的条件放在
2. 通过分析查询结果反馈改进查询
- 检查匹配文档数量:如果返回的匹配文档数量过多,可能需要增加更严格的过滤条件。例如,在搜索商品时,若返回了大量结果,可以增加价格区间、品牌等更细粒度的条件。
- 查看命中文档相关性:对于搜索结果中相关性低的文档,检查查询条件和分析器设置。可能是分析器分词不当导致相关性计算错误,需要调整分析器或者修改查询条件的权重。
- 分析耗时字段:使用Elasticsearch的性能分析工具,查看查询过程中哪个部分耗时最长,是过滤条件计算、排序还是其他操作。针对耗时部分进行优化,例如优化排序字段的索引设置或者调整复杂过滤条件的逻辑。