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

弹性搜索查询,用于匹配同一嵌套字段的不同值

聂季同
2023-03-14

我试图获取嵌套文档中有两个名称的文档,但是< code>must子句作为“OR”而不是“AND”工作。下面是一个例子:

映射:

curl  -XPUT "http://localhost:9200/my_index" -d '
{
  "mappings": {
    "blogpost": {
      "properties": {
        "comments": {
          "type": "nested",
          "properties": {
            "name":    { "type": "keyword"   },
            "age":     { "type": "short"   }
          }
        }
      }
    }
  }
}'

索引3个文档:

curl  "http://localhost:9200/my_index/blogpost/1" -d '
{
  "title": "doc1",
  "comments": [
    {
      "name":    "John Smith",
      "age":     28
    },
    {
      "name":    "Alice White",
      "age":     31
    }
  ]
}
'

curl  "http://localhost:9200/my_index/blogpost/2" -d '
{
  "title": "doc2",
  "comments": [
    {
      "name":    "Luther Lawrence",
      "age":     21
    },
    {
      "name":    "Alice White",
      "age":     19
    }
  ]
}
'

curl  "http://localhost:9200/my_index/blogpost/3" -d '
{
  "title": "doc3",
  "comments": [
    {
      "name":    "Tadhg Darragh",
      "age":     22
    },
    {
      "name":    "Alice White",
      "age":     31
    },
    {
      "name":    "Lorene Hicks",
      "age":     44
    }
  ]
}
'

我正在寻找在同一文档中与“爱丽丝·怀特”和“约翰·史密斯”comments.name 的文档,使用上述数据只有文档ID 1会匹配。我尝试了这个查询:

curl  "http://localhost:9200/my_index/blogpost/_search" -d '
{
  "_source": { "include": "title" },
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "bool": {
          "must": [
            { "terms": { "comments.name": ["John Smith", "Alice White"] } }
          ]
        }
      }
    }
  }
}
'

它与所有文档匹配,因为所有文档都有“John Smith”或“Alice White”。改进此查询以具有两个分离的匹配项query.nested.query.bool.must[]. words,每个值一个匹配器:

curl  "http://localhost:9200/my_index/blogpost/_search" -d '
{
  "_source": { "include": "title" },
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "bool": {
          "must": [
            { "term": { "comments.name": "John Smith" } },
            { "term": { "comments.name": "Alice White" } }
          ]
        }
      }
    }
  }
}
'

那么,我的问题是,如何构建一个查询来仅匹配具有“爱丽丝·怀特”“约翰·史密斯”的文档

ps. 在这里放置了一个带有示例的脚本

共有1个答案

东方文林
2023-03-14
{
  "_source": {
    "include": "title"
  },
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "comments",
            "query": {
              "bool": {
                "must": [
                  {
                    "terms": {
                      "comments.name": [
                        "John Smith"
                      ]
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "comments",
            "query": {
              "bool": {
                "must": [
                  {
                    "terms": {
                      "comments.name": [
                        "Alice White"
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
 类似资料:
  • 我正在尝试使用C#使用Nest进行匹配查询。Match查询不会返回任何结果,因为生成的JSON的语法似乎不正确,我确信有一些文档包含此关键字。下面是C代码片段 这将生成以下查询: 但是,当我在Kibana控制台Get\u search中调整同一查询时,该查询返回0个结果 我得到搜索词的结果。请注意,Kibana查询的语法中缺少“第二个查询标记”。 我确实检查了文档,似乎我的语法是正确的https:

  • 我试图为一个业务场景制定一个查询,其中我们有一个名为“types”的嵌套字段类型(即类似于字符串的ArrayList)。下面是以“类型”作为字段之一的索引文档示例。 文件1:{“类型”:[{“标签”:“对话”,},{“标签”:“暴力”,},{“标签”:“语言”,}} 文档2:{“类型”:[{“标签”:“对话框”,}} 现在,要求搜索查询最多匹配字段值中的一个值,即如果用户搜索“对话框”,那么它应该

  • 基本问题如下:有没有一种方便的方法可以为嵌套查询的所有字段指定多字段匹配?对于普通查询有效。这在嵌套查询中不起作用,可能是因为嵌套对象没有_all? 下面是更详细的问题: 我有一个名为“Parent”的嵌套文档,如下所示: 这是我用于制作儿童嵌套对象的映射: 这是一个查询,我想使用所有子字段的匹配来选择几个术语查询,以及一个术语查询: 上述查询不起作用,因为我无法为嵌套对象选择多匹配查询中的所有字

  • 我使用的是ES版本5.6。我有一个像下面这样的文档存储在ES中。 我想搜索所有已“启用”的字段。 我尝试了以下查询,但都不起作用。 但是下面的查询起作用了 因此,看起来只匹配顶级字段,而不匹配嵌套字段。是否有任何方法可以查询包含在所有字段中的文本,包括嵌套字段。我不想显式指定嵌套字段名。我正在寻找一种全局搜索,我想在文档中的任何地方搜索“文本”。 谢了。

  • 如何获得空数组和美国的结果和

  • 我有一个弹性搜索索引集合,如下所示, 现在我需要通过将与其值匹配来搜索文档。(是一些字段,其值存储在中)例如。对于字段,如果它是,则应与上述文档匹配。 我尝试将其映射为嵌套对象,但我无法编写查询来搜索与其相应值匹配的2个或更多的键id。