ElasticSearch:如何筛选keyword类型JSON字段value.value中ID_TRANSACTION=304的记录
ElasticSearch 查询 JSON 字符串字段中包含特定键值对的记录
首先修正你原始查询中的语法错误(括号不闭合、结构层级错误),然后添加筛选value.value字段中包含ID_TRANSACTION=304的条件,具体方案如下:
核心思路
由于value.value是keyword类型的JSON字符串,无法直接解析内部结构进行字段级查询,因此可以通过子串匹配的方式筛选目标记录。
完整查询语句
{ "query": { "bool": { "must": [ { "term": { "valueType": { "value": "VARIABLE", "boost": 1 } } }, { "term": { "intent": { "value": "CREATED", "boost": 1 } } }, { "term": { "recordType": { "value": "EVENT", "boost": 1 } } }, { "term": { "position": { "value": 16185492, "boost": 1 } } }, // 新增:筛选包含ID_TRANSACTION=304的JSON字符串 { "wildcard": { "value.value": "*\"ID_TRANSACTION\":304*" } } ] } }, "_source": true }
可选方案:正则匹配
如果需要更精确的匹配(比如避免误匹配类似ID_TRANSACTION=3040的情况),可以替换为regexp查询:
{ "regexp": { "value.value": ".*\"ID_TRANSACTION\":304(,|}).*" } }
该正则会匹配ID_TRANSACTION":304后紧跟逗号或右大括号的场景,避免部分匹配。
注意事项
- 由于
keyword类型字段不支持分词,上述查询是基于整个字符串的子串匹配,性能略低于结构化字段查询;如果后续有大量此类需求,建议将value.value重新映射为object类型,以便直接查询内部字段。 - 查询中的双引号需要转义,确保JSON语法正确。
内容的提问来源于stack exchange,提问作者NiBE
相关产品推荐
相关产品推荐

