当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch:查询数组中包含两个键值对的文档

锺离嘉茂
2023-03-14

如何查询同时包含键值对“key1”-“value1”和“key2”-“value2”的文档?我似乎找不到关于这个的任何文件。

我尝试了下面的查询,但它没有返回任何结果,即使应该有匹配的文档。虽然用should替换must是可行的,但当我将minimum_should_match=100%时,它也不会返回任何结果。

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "attributes",
            "query": {
              "bool": {
                "must": [
                  [
                    {
                      "match_phrase": {
                        "attributes.key": "key1"
                      }
                    },
                    {
                      "match_phrase": {
                        "attributes.value": "value1"
                      }
                    }
                  ],
                  [
                    {
                      "match_phrase": {
                        "attributes.key": "key2"
                      }
                    },
                    {
                      "match_phrase": {
                        "attributes.value": "value2"
                      }
                    }
                  ]
                ]
              }
            }
          }
        },
        [
          {
            "match_all": {

            }
          }
        ]
      ]
    }
  }
}

这是映射的外观:

{
    "index_name": {
        "mappings": {
            "type_name": {
                "properties": {
                    "attributes": {
                        "type": "nested",
                        "properties": {
                            "key": {
                                "type": "string",
                                "analyzer": "flat"
                            },
                            "value": {
                                "type": "string",
                                "analyzer": "flat"
                            }
                        }
                    }
                }
            },
        }
    }
}

非常感谢你的帮助。

共有2个答案

田彬郁
2023-03-14

我在Elastic 5中遇到了同样的问题,不得不稍微调整建议的答案以使其正常工作,因为过滤查询已被弃用。(没有收到为[filtered]注册的[query])。

使用Elastic 5,以下结构为我解决了此问题:

{
    "query" : {
        "bool" : {
            "must" : [
                {
                    "nested" : {
                        "path": "attributes",
                        "query" : {
                            "bool" : {
                                "must" : [
                                    { "term" : { "attributes.key" : "key1" } },
                                    { "term" : { "attributes.value" : "value1" } }
                                ]
                            }
                        }
                    }
                },
                {
                    "nested" : {
                        "path" : "attributes",
                        "query" : {
                            "bool" : {
                                "must" : [
                                    { "term" : { "attributes.key" : "key2" } },
                                    { "term" : { "attributes.value" : "value2" } }
                                ]
                            }
                        }
                    }
                }
            ]
        }
    }
}
陆俊智
2023-03-14

试试这个:

POST /test_index/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "bool": {
               "must": [
                  {
                     "nested": {
                        "path": "attributes",
                        "query": {
                           "bool": {
                              "must": [
                                 {
                                    "term": {
                                       "attributes.key": "key1"
                                    }
                                 },
                                 {
                                    "term": {
                                       "attributes.value": "value1"
                                    }
                                 }
                              ]
                           }
                        }
                     }
                  },
                  {
                     "nested": {
                        "path": "attributes",
                        "query": {
                           "bool": {
                              "must": [
                                 {
                                    "term": {
                                       "attributes.key": "key2"
                                    }
                                 },
                                 {
                                    "term": {
                                       "attributes.value": "value2"
                                    }
                                 }
                              ]
                           }
                        }
                     }
                  }
               ]
            }
         }
      }
   }
}

下面是我用来测试它的代码(我只是使用了标准分析器,因为我不知道你的平面分析器是什么样子;所以你可能需要调整一下):

http://sense.qbox.io/gist/13b7e2aa4d90bfb2f82787c6a00494ee3343e013

 类似资料:
  • > 检查Postgres JSON数组是否包含字符串 在postgreSQL中从表中查询json对象 带有嵌入JSON对象的PostgreSQL JSON查询 如何实现这些查询?我相信如果我知道如何查询一个问题,那么我将能够解决其他问题。 我将提供任何可能需要的信息来解决这个问题。

  • 问题内容: 假设我创建了一个像这样的文档: 我可以使用GET / idx / type / 1检索文档: 现在,我想检查字段“ the_field”是否包含值2。我知道我可以使用term子句,但是我需要使用过滤器脚本检查它,因此我尝试了: 并没有结果: 为了测试我的mevl脚本语法是否正确,我尝试这样做: 并获得正确的结果: 我究竟做错了什么? 我认为doc [‘the_field’]。value

  • 问题内容: 我使用 PostgreSQL 9.5 和Rails5。我想查询下面显示的包含JSON对象数组的列,以返回包含并执行计数的所有JSON数组元素。我使用 的 SQL 显示在json数据下方。运行查询只会返回一个空数组。 这是我的数据: 我想要其中一个sql查询返回: 和另一个查询以返回数组,以便我可以在应用程序中对其调用count,还可以遍历它以创建表单: 我试过这个SQL查询: 我也试过

  • 我使用PostgreSQL 9.5和Rails 5。我想查询下面显示的包含JSON对象数组的jsonb列,以返回包含的所有JSON数组元素,并执行计数 我使用的SQL显示在json数据下面。运行查询只返回一个空数组。 我尝试了这里和这里建议的查询。 这就是我的jsonb数据的样子: 我希望其中一个sql查询返回: 和另一个返回数组的查询,以便我可以在我的应用程序中调用count并循环使用它来创建表

  • 问题内容: 我有一对对。是否可以精确匹配&的值,然后检查其范围值? 示例:在doc下面是一个带有名称,值对的数组。我需要检查它是否具有键,然后检查它的值是否小于1000。 以下是我的过滤器。 我还需要检查以下内容,以便返回结果 “ client.name”必须是“ Athena” “ client.db。@ type”必须为“ Oracle”,然后继续进行以下检查 找不到“ client.db.o

  • 如果我有文件: 我想用“红棕色黄”查询,得到文档1。 我怎么能这么做?反过来很容易...