You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:50:12