1. 问题
1. 使用全文检索时,文件名未命中(朱发现)
2. 文件名命中,但排名靠后(分数太低)(在解决第一个问题后测试时发现)
2. 问题挖掘
2.1 文件名未命中
文件名在数据结构中字段名为 common.file_name ,字段类型为 keyword
问题是 query_string 查询无法对 keyword 类型字段进行有效查询(必须完全匹配、不支持通配符查询)
因此,查询文件名需要单独将 common.file_name作为 wildcard 查询,与其他关键字进行并列查询
这个问题比较好解决,整体调整查询 DSL 语句就可以
2.2 文件名命中排名靠后
这个问题的本质是通过文件名命中的文档,ES打分偏低,了解这个问题,可以参考 @腾讯云开发者 的文章: 总是搜不到想要的内容?Elasticsearch搜索排名优化了解一下
在对排名靠后的文章调用 _explain API 分析后,发现:
- 对于 keyword 类型的 common.file_name 字段的检索,其分数等于给该字段查询提供的 boost 权值,是一个常数,
- 而对于 text 类型的其他字段的检索,其分数跟各字段的分数权值、命中检索词的个数、命中字段的 tf/idf 等条件有关,往往会远大于common.file_name 字段的打分。
得到的结论就是,keyword 检索与 text 检索位于同一级别的检索中时,打分方式不同,得到的结果排序很难如预期。