Elasticsearch 如何为每个指定标题关键词各返回4条匹配菜谱?
问题原因
- 配置错误:
_source.includes参数用于指定返回结果需要保留的文档字段,你填写的数值4不符合参数格式要求,属于无效配置。 - 逻辑不符合需求:当前
bool.should查询只会召回所有匹配任意关键词的文档,默认按相关性评分排序返回前4条,如果spaghetti相关的菜谱评分更高,就会出现返回结果全部匹配同一个关键词的问题,无法保证每个关键词各返回1条结果。
修正后的查询方案
你可以使用filters聚合结合top_hits子聚合,实现按关键词分组,每组返回1条匹配结果,最终刚好得到4条分别匹配不同关键词的菜谱:
body: { "size": 0, // 不需要返回原始查询命中的文档列表,只返回聚合结果 "aggs": { "recipes_by_keyword": { "filters": { "filters": { "eggs": {"match": {"Title": "Eggs"}}, "apple": {"match": {"Title": "Apple"}}, "onion": {"match": {"Title": "Onion"}}, "spaghetti": {"match": {"Title": "spaghetti"}} } }, "aggs": { "top_1_recipe": { "top_hits": { "size": 1, "_source": ["Title", "steps", "ingredients"] // 替换为你实际需要返回的菜谱字段即可 } } } } } }
结果获取说明
查询返回后,从aggregations.recipes_by_keyword.buckets下的每个分组里取top_1_recipe.hits.hits[0]即可拿到对应关键词的匹配菜谱。
内容的提问来源于stack exchange,提问作者Ryszard Rozynski
相关产品推荐
相关产品推荐

