Elasticsearch嵌套查询must逻辑失效,需实现多技能AND匹配
问题修正:Elasticsearch 5.6.5 多嵌套技能AND查询
问题根源
hard_skills是nested类型,数组中的每个技能都是独立的嵌套文档。你之前的查询逻辑是要求同一个嵌套文档同时包含ruby和rails,但实际数据中每个技能是分开存储的,因此无法匹配到结果。
修正后的查询
要实现"同时具备多个技能"的AND逻辑,需要为每个技能单独创建一个nested查询,并将这些查询放在外层bool的filter(或must)中:
{ "query": { "bool": { "must": [ { "term": { "class_id": 15 } } ], "filter": [ { "nested": { "path": "hard_skills", "query": { "bool": { "must": [ { "term": { "hard_skills.name": "ruby" } } ] } } } }, { "nested": { "path": "hard_skills", "query": { "bool": { "must": [ { "term": { "hard_skills.name": "rails" } } ] } } } } ] } } }
逻辑说明
- 每个
nested查询负责匹配包含指定技能的嵌套文档 - 外层
bool.filter中的多个nested查询是AND关系:只有当学生的hard_skills数组中同时存在包含ruby的嵌套文档和包含rails的嵌套文档时,才会被匹配 - 由于你的
hard_skills.name使用了keyword分析器,用term查询比match更精准,避免分词影响
验证
针对你提供的数据样例,该查询会匹配到class_id=1的John(同时拥有ruby和rails技能),而不会匹配Jane(只有rails)或Bob(只有c)。
内容的提问来源于stack exchange,提问作者Marcin Kozdraś
相关产品推荐
相关产品推荐

