当前位置: 首页 > 面试题库 >

如何通过键值对elasticsearch数组中的键匹配数组值?

谷梁驰
2023-03-14
问题内容

我有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"
                            }
                        ]
                    }
                }
            }
        ]
    }
}


 类似资料:
  • 问题内容: 我有一个数组模型如下: 现在我有了一个Empid的数组。 所以现在我需要过滤第一个包含第二个中所有键的数组。 输出: 我可以使用循环进行此操作,但是由于我的模型对象中有100多个记录。我需要如何更好地处理此问题的建议。 我正在考虑创建一个自定义过滤器,但是您对此有何看法(如果可以,请提供示例代码来实现此目的)。 感谢您的帮助。 谢谢。 问题答案: 你可以做到这一点, 如果返回一个值,则

  • 问题内容: 有谁知道(如果可能的话,也用破折号)通过对象键对对象数组进行分组然后根据分组创建新的对象数组的方法吗?例如,我有一系列汽车对象: 我想制作一组新的汽车对象,并按以下类别分组: 问题答案: 。简单,并允许在分组结构中的对象中进行一些重复。 但是,OP还要求删除重复的密钥。如果您想一路走下去: 产量: 如果您想使用Underscore.js进行此操作,请注意,其版本称为。

  • 问题内容: 我在索引文档中具有以下结构: 我可以使用匹配查询“ customLists.id = 26”来搜索属于给定列表的匹配文档。但是我需要根据该列表中的位置值对文档进行排序,并忽略其他列表的位置。 因此,预期结果将按document2,document1,document3的顺序排列 数据结构是否适合这种排序以及如何处理? 问题答案: 实现此目的的一种方法是将的映射类型设置 为嵌套,然后使用

  • 问题内容: 我需要结合由两个rest服务提供的两个json数组。具有相同“ id”的条目属于在一起。 我需要以以下方式(我的模型在angular2中)在javascript中组合/复制/克隆json数组: 有没有办法将它们结合起来?参数名称未完全定义,需要与可变参数向量一起使用。 我尝试了每个循环混合。在我看来非常难看。 问题答案: 如果要编写它以便可以接受任意数量的数组,而不仅仅是2个,则可以利

  • 问题内容: 在Python中,可以向1构造函数传递一系列键值对: 除了为此目的定义我自己的函数外,我想不出其他任何方法来在JavaScript中执行此类操作: 但是我是JS新手…这种对对对象转换是否内置任何内容? 1出于这个问题的目的,我将Python字典视为JS对象的Python副本,尽管当然相似性仅限于它们都是键值集合这一事实。 问题答案: 在撰写本文时(2013年),JavaScript对象

  • 问题内容: 假设您有一个非常简单的数据结构: …并且您想将其中一些存储在javascript变量中。如我所见,您有三个选择: 如果您要存储(或希望可能拥有)多个“价值”部分(例如,增加他们的年龄等),显然第二或第三种选择是可行的,因此,为了论证,让我们假设在此结构中再也不需要任何数据值了。您选择哪一个,为什么? 编辑 :该示例现在显示最常见的情况:非顺序ID。 问题答案: 每个解决方案都有其用例。