如何使用HashMap查询Elasticsearch并匹配完整Map键值对
Elasticsearch Map 完全匹配查询(Kotlin QueryBuilder 实现)
场景说明
假设已索引以下两个文档:
// 文档1(目标匹配文档) { "props": {"cp1": "cv1", "cp2": "cv2"} } // 文档2(不匹配,仅含部分键值) { "props": {"cp1": "cv1"} }
需要通过完整的Map {"cp1":"cv1","cp2":"cv2"} 查询,仅返回文档1。
实现方案
1. 基础匹配:包含所有指定键值(允许额外键)
如果仅要求文档props包含所有查询的键值对(不限制是否有额外键),可以用bool.must组合多个term查询:
import org.elasticsearch.index.query.QueryBuilders.boolQuery import org.elasticsearch.index.query.QueryBuilders.termQuery fun buildMapMatchQuery(targetProps: Map<String, String>): org.elasticsearch.index.query.QueryBuilder { val boolQuery = boolQuery() targetProps.forEach { (key, value) -> boolQuery.must(termQuery("props.$key", value)) } return boolQuery }
2. 严格匹配:键值对完全一致(无额外键)
如果要求文档props与查询Map完全一致(既包含所有指定键值,也没有额外键),需额外添加字段数量校验:
import org.elasticsearch.index.query.QueryBuilders.* fun buildStrictMapMatchQuery(targetProps: Map<String, String>): org.elasticsearch.index.query.QueryBuilder { val boolQuery = boolQuery() // 匹配所有指定键值对 targetProps.forEach { (key, value) -> boolQuery.must(termQuery("props.$key", value)) } // 限制props的字段数量与查询Map的键数一致,确保无额外键 boolQuery.must(scriptQuery("doc['props'].size() == ${targetProps.size}")) return boolQuery }
注意事项
- 确保
props字段在Elasticsearch映射中为object类型(默认配置即可)。 - 动态生成的Map键也适用上述方案,逻辑会自动遍历所有键值构建查询条件。
- 脚本查询需确保Elasticsearch允许脚本执行(默认开启,若有安全限制需调整
elasticsearch.yml中的script.allowed_types等配置)。
使用示例
val targetMap = mapOf("cp1" to "cv1", "cp2" to "cv2") val query = buildStrictMapMatchQuery(targetMap) // 组装查询请求并执行 val searchRequest = SearchRequest("your_index_name") .source(SearchSourceBuilder().query(query))
内容的提问来源于stack exchange,提问作者SandhyaRani D
相关产品推荐
相关产品推荐

