如何通过键值对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结果

  1. “ client.name”必须是“ Athena”
  2. “ client.db。@ type”必须为“ Oracle”,然后继续进行以下检查
  3. 找不到“ client.db.oracle_props。@ name”字段
  4. 检查它是否具有“ 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"

}

}

}

}

...

回答:

让我们开始吧:

  1. 您似乎错误地映射了嵌套路径,它oracle_propsdb示例文档中的子项,而不是映射中的子项,在映射中它直接显示为根的子项。
  2. 您将映射oracle_props.@valuelong,但YCREATE_PERMISSION嵌套文档中为其分配了文本
  3. 您查询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

回到顶部