ElasticSearch复合查询编写:满足姓名与职业组合筛选条件的查询实现
ElasticSearch 复合查询实现方案
核心需求逻辑梳理
整个查询需要满足两组条件同时成立的逻辑,两组内部为“或”匹配关系:
- 条件组1:
first_name字段值为John,或last_name字段值为John - 条件组2:
job字段值为IT,或job字段值为Student
两组之间为“与”的关系,任意一组不满足,文档就会被过滤。
具体查询语句
基于ES的bool复合查询语法实现,通过must关联两个必须同时满足的条件组,每个条件组内部通过should实现“或”匹配,同时设置minimum_should_match: 1保障同组内至少命中一条规则:
GET /你的目标索引/_search { "query": { "bool": { "must": [ { // 匹配第一组:姓/名包含John的文档 "bool": { "minimum_should_match": 1, "should": [ { "term": { "first_name.keyword": "John" } }, { "term": { "last_name.keyword": "John" } } ] } }, { // 匹配第二组:职业为IT/Student的文档 "bool": { "minimum_should_match": 1, "should": [ { "term": { "job.keyword": "IT" } }, { "term": { "job.keyword": "Student" } } ] } } ] } } }
匹配结果说明
用给出的样例数据执行查询时,最终会命中2条文档:
first_name=Kevin, last_name=John, job=IT:满足last_name为John、job为IT的要求first_name=John, last_name=Villa, job=Student:满足first_name为John、job为Student的要求
其余两条文档因为不满足双组的与逻辑,会被过滤掉。
实现注意事项
- 上述语句中的
.keyword是ES动态映射下,文本字段自动生成的精确匹配子字段,如果你的索引字段本身就配置为keyword类型,直接写字段名即可,无需额外加.keyword后缀 - 不要把两个条件组的
should规则直接平铺到最外层的bool查询下,否则会变成“只要命中任意一条规则就返回”的逻辑,和原需求的双组与逻辑不匹配
内容的提问来源于stack exchange,提问作者Sokmesa Khiev
相关产品推荐
相关产品推荐

