【发布时间】:2014-09-01 15:21:42
【问题描述】:
我有一组 key value 对。是否可以精确匹配 key 的值,然后检查它的 value 的范围值?
示例:在下面的文档中,oracle_props 是一个具有名称、值对的数组。我需要检查它是否有 "oracle_cursors" 键,然后检查它的值是否小于 1000。
GET /eg/message/_percolate
{
"doc": {
"client": {
"name": "Athena",
"version": 1,
"db": {
"@type": "Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 64bit",
"oracle_props": [
{
"@name": "open_cursors",
"@value": 4000
},
{
"@name": "USER_ROLE_PRIVS_COUNT",
"@value": 1
},
{
"@name": "CREATE_PERMISSION",
"@value": "Y"
}
]
}
}
}
}
下面是我的过滤器。
我还需要检查以下内容,以便它返回 3 作为我的结果
- “client.name”必须是“Athena”
- “client.db.@type”必须是“Oracle”然后只检查以下几点
- “client.db.oracle_props.@name”字段未找到
- 检查它是否有“oracle_cursors”键,然后检查它的值是否
1 和 2 是和操作,并且 3 或 4 中的任何一个都满足它应该导致 3。我需要关于第 4 点的帮助,以下是我的查询。如果有更好的方法也请提出建议。
PUT /eg/.percolator/3
{
"query": {
"filtered": {
"filter": {
"or": [
{
"missing": {
"field": "client.db.oracle_props.@name"
}
}
]
},
"query": {
"bool": {
"must": [
{
"match": {
"client.name": "Athena"
}
},
{
"match": {
"client.db.@type": "Oracle"
}
}
]
}
}
}
}
}
更新
我可以有类似下面的东西
{
"match": {
"client.db.oracle_props[name='open_cursors'].value": 4000
}
}
更多尝试
我关注elasticsearch nested query 并通过重新索引将映射更改为nestedtype。谁能找到问题为什么我收到nested: NullPointerException;?
PUT /eg/.percolator/3
{
"nested" : {
"path" : "client.db.oracle_props",
"score_mode" : "avg",
"query" : {
"bool" : {
"must" : [
{
"match" : {"client.db.oracle_props.@name" : "open_cursors"}
},
{
"range" : {"client.db.oracle_props.@value" : {"lt" : 4000}}
}
]
}
}
}
}
映射变化
...
"properties": {
"@type": {
"type": "string"
},
"oracle_props": {
"type" : "nested",
"properties": {
"@name": {
"type": "string"
},
"@value": {
"type": "long"
}
}
}
}
...
【问题讨论】:
标签: json elasticsearch