如何通过键值对elasticsearch数组中的键匹配数组值?
我有key value
一对对。是否可以精确匹配key
&的值,然后检查其value
范围值?
示例:在doc下面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”键,然后检查其值是否小于1000
1&2是and操作,并且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
嵌套查询,并通过重新索引将映射更改为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"
}
}
}
}
...
回答:
让我们开始吧:
- 您似乎错误地映射了嵌套路径,它
oracle_props
是db
示例文档中的子项,而不是映射中的子项,在映射中它直接显示为根的子项。 - 您将映射
oracle_props.@value
为long
,但Y
在CREATE_PERMISSION
嵌套文档中为其分配了文本 - 您查询
range lt 4000
,但 4000,lte
适合您
我没有得到您要求的缺失值,因此我跳过了它。
为了使您走上正确的道路,我必须对它进行一些简化(因为我无法完全理解问题中的所有问题,对不起)
我也不打算进行渗透,而是将所有内容重命名为twitter / tweet,因为这对于我从示例中复制而言更容易。
1)创建空索引“ twitter”
curl -XDELETE 'http://localhost:9200/twitter/'curl -XPUT 'http://localhost:9200/twitter/'
2)为实际的“ tweet”创建geo_point映射
curl -XPUT 'http://localhost:9200/twitter/tweet/_mapping' -d '{
"tweet": {
"properties": {
"db": {
"type": "object",
"properties": {
"@type": {
"type": "string"
},
"oracle_props": {
"type": "nested",
"properties": {
"@name": {
"type": "string"
},
"@value": {
"type": "string"
}
}
}
}
}
}
}
}'
3)让我们检查一下是否设置了映射
curl -XGET 'http://localhost:9200/twitter/tweet/_mapping?pretty=true'
4)发布一些带有嵌套数据的推文
curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ "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"
}
]
}
}'
5)仅嵌套查询
curl -XGET localhost:9200/twitter/tweet/_search -d '{ "query": {
"nested" : {
"path" : "db.oracle_props",
"score_mode" : "avg",
"query" : {
"bool" : {
"must" : [
{
"term": {
"db.oracle_props.@name": "open_cursors"
}
},
{
"range": {
"db.oracle_props.@value": {
"lte": 4000
}
}
}
]
}
}
}
}
}';
6)查询“雅典娜”和“ Oracle”
curl -XGET localhost:9200/twitter/tweet/_search -d '{ "query" : {
"bool" : {
"must" : [
{
"match" : {"tweet.name" : "Athena"}
},
{
"match" : {"tweet.db.@type" : "Oracle"}
}
]
}
}
}'
7)结合前两个查询
curl -XGET localhost:9200/twitter/tweet/_search -d '{ "query" : {
"bool" : {
"must" : [
{
"match" : {"tweet.name" : "Athena"}
},
{
"match" : {"tweet.db.@type" : "Oracle"}
},
{
"nested" : {
"path" : "db.oracle_props",
"score_mode" : "avg",
"query" : {
"bool" : {
"must" : [
{
"term": {
"db.oracle_props.@name": "open_cursors"
}
},
{
"range": {
"db.oracle_props.@value": {
"lte": 4000
}
}
}
]
}
}
}
}
]
}
}
}'
结果为
{ "took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 2.462332,
"hits": [
{
"_index": "twitter",
"_type": "tweet",
"_id": "1",
"_score": 2.462332,
"_source": {
"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"
}
]
}
}
}
]
}
}
以上是 如何通过键值对elasticsearch数组中的键匹配数组值? 的全部内容, 来源链接: utcz.com/qa/426202.html