Elasticsearch多条件查询及可选匹配排序需求
Elasticsearch 查询实现方案
索引映射(修正后)
原映射中hobbiles定义为keyword类型,但实际存储的是对象数组,会导致无法正确查询嵌套字段,需修改为nested类型:
{ "mappings": { "properties": { "age": { "type": "long" }, "hobbiles": { "type": "nested", "properties": { "name": { "type": "keyword" }, "level": { "type": "keyword" } } } } } }
示例文档
[ { "_id": "test@domain.com", "age": 12, "hobbiles": [ { "name": "Singing", "level": "begineer" }, { "name": "Dancing", "level": "begineer" } ] }, { "_id": "test1@domain.com", "age": 7, "hobbiles": [ { "name": "Coding", "level": "begineer" }, { "name": "Chess", "level": "begineer" } ] }, { "_id": "test2@domain.com", "age": 20, "hobbiles": [ { "name": "Singing", "level": "begineer" }, { "name": "Dancing", "level": "begineer" } ] }, { "_id": "test3@domain.com", "age": 21, "hobbiles": [ { "name": "Coding", "level": "begineer" }, { "name": "Dancing", "level": "Football" } ] } ]
需求说明
- 基础条件:文档
_id在["test@domain.com", "test1@domain.com", "test3@domain.com"]范围内,且age > 5 - 排序规则:匹配
hobbiles.level为Football的文档排在结果顶部,其余满足基础条件的文档紧随其后
查询DSL实现
{ "query": { "bool": { "filter": [ { "terms": { "_id": ["test@domain.com", "test1@domain.com", "test3@domain.com"] } }, { "range": { "age": { "gt": 5 } } } ], "should": [ { "nested": { "path": "hobbiles", "query": { "term": { "hobbiles.level": "Football" } } } } ], "minimum_should_match": 0 } }, "sort": [ { "_score": { "order": "desc" } }, { "_id": { "order": "asc" } } ] }
结果说明
- 匹配
hobbiles.level:Football的test3@domain.com会获得更高评分,排在首位 - 满足基础条件的
test@domain.com和test1@domain.com按_id升序排列在后面,最终结果顺序为[test3@domain.com, test@domain.com, test1@domain.com]
内容的提问来源于stack exchange,提问作者Pradip
相关产品推荐
相关产品推荐

