Elasticsearch新增stocks数组字段及多条件查询实现咨询
Elasticsearch映射修改与查询实现
是否需要修改映射设置?
需要。原索引映射未定义stocks字段,且该字段为数组对象(嵌套类型),必须明确配置映射才能确保后续嵌套条件查询的正确性,避免Elasticsearch自动推断映射导致的查询异常。
修改后的完整索引映射
{ "indices": { "mappings": { "default": { "properties": { "id": { "type": "keyword" }, "name": { "type": "text", "analyzer": "english" }, "stocks": { "type": "nested", "properties": { "stock_id": { "type": "integer" }, "qty": { "type": "integer" }, "hidden": { "type": "boolean" } } } } } } } }
说明:将
stocks定义为nested类型,因为数组对象在Elasticsearch中默认会被扁平化处理,只有嵌套类型才能保证单个对象内多个字段条件的关联匹配。
原生Elasticsearch查询语句
以下查询实现按name搜索,同时满足stocks字段的三个条件:
{ "query": { "bool": { "must": [ { "match": { "name": "要搜索的关键词" } }, { "nested": { "path": "stocks", "query": { "bool": { "must": [ { "terms": { "stocks.stock_id": [1, 2, 3] } }, { "range": { "stocks.qty": { "gt": 0 } } }, { "bool": { "must_not": [ { "term": { "stocks.hidden": true } } ] } } ] } }, "inner_hits": {} } } ] } } }
说明:
- 使用
nested查询关联stocks对象内的多个条件,确保匹配的是同一个数组元素中的字段值terms实现stock_id IN [1,2,3]的匹配range实现qty>0的筛选must_not+term实现hidden != true的条件(包含hidden为false或不存在的情况)
内容的提问来源于stack exchange,提问作者rst630
相关产品推荐
相关产品推荐

