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

对嵌套对象的所有字段进行匹配的弹性搜索嵌套查询

杨乐意
2023-03-14

基本问题如下:有没有一种方便的方法可以为嵌套查询的所有字段指定多字段匹配?对于普通查询{匹配:{_all:"查询字符串"}}有效。这在嵌套查询中不起作用,可能是因为嵌套对象没有_all?

下面是更详细的问题:

我有一个名为“Parent”的嵌套文档,如下所示:

{
    "children" : [
        { 
            "field_a": "value_a_1",
            "field_b" : "value_b_1",
            "field_c" : [ {
                "field_c_a" : "value_c_a_1",
                "field_c_b" : "value_c_b_1"
            } ]
        },
        { 
            "field_a": "value_a_2",
            "field_b" : "value_b_2",
            "field_c" : [ {
                "field_c_a" : "value_c_a_2",
                "field_c_b" : "value_c_b_2"
            } ]
        }
    ]
}

这是我用于制作儿童嵌套对象的映射:

"Parent" : {
    "properties" : {
        "children" : {
            "type" : "nested",
            "include_in_parent" : true
                }
    }
}

这是一个查询,我想使用所有子字段的匹配来选择几个术语查询,以及一个术语查询:

"query" : {
    "nested": { 
        "path" : "children",
        "query" : {
            "bool" : {
                "must" : [
                        {"multi_match" : {"query": "value_c_a_1", "fields" : ["children.*"]}},
                        {"term" : {children.field_a : "value_a_1" }}
                    ]
                }
            }
    } 
}

上述查询不起作用,因为我无法为嵌套对象选择多匹配查询中的所有字段。

"query" : {
    "nested": { 
        "path" : "children",
        "query" : {
            "bool" : {
                "must" : [
                        {"multi_match" : {"query": "value_c_a_1", "fields" : ["*_c_a"]}}
                    ]
                }
            }
    } 
}

上面的查询之所以有效,是因为模式匹配允许将*放在字符串之前,但出于某种原因(?)

有没有一种很好的速记方法来选择嵌套对象的所有字段?

如果能知道为什么预期的子项 *通配符不能按预期工作,那也会很好。

共有1个答案

鲜于河
2023-03-14

对我来说工作正常(注:Elasticsearch 1.7)。注意不同的名字(parent,somechildren)——我还没有用原来的名字测试过它,但它可能与它有关。

图式:

curl -XPUT localhost:9200/test -d '{
  "mappings": {
    "aparent": {
      "properties": {
        "somechildren": {
          "type": "nested",
          "include_in_parent": true
        }
      }
    }
  }
}'

文档:

curl -XPUT localhost:9200/test/aparent/1 -d '{
  "somechildren" : [
    {
      "field_a": "value_a_1",
      "field_b" : "value_b_1",
      "field_c" : [ {
        "field_c_a" : "value_c_a_1",
        "field_c_b" : "value_c_b_1"
      } ]
    },
    {
      "field_a": "value_a_2",
      "field_b" : "value_b_2",
      "field_c" : [ {
        "field_c_a" : "value_c_a_2",
        "field_c_b" : "value_c_b_2"
      } ]
    }
  ]
}'

查询:

GET test/_search
{
  "query": {
    "nested": {
      "path": "somechildren",
      "query": {
        "bool": {
          "must": [
            {
              "multi_match": {
                "query": "value_c_a_1",
                "fields": [
                  "somechildren.*"
                ]
              }
            },
            {
              "term": {
                "somechildren.field_a": {
                  "value": "value_a_1"
                }
              }
            }
          ]
        }
      }
    }
  }
}

结果:

  {
     "took": 2,
     "timed_out": false,
     "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
     },
     "hits": {
        "total": 1,
        "max_score": 0.8603305,
        "hits": [
           {
              "_index": "test",
              "_type": "aparent",
              "_id": "1",
              "_score": 0.8603305,
              "_source": {
                 "somechildren": [
                    {
                       "field_a": "value_a_1",
                       "field_b": "value_b_1",
                       "field_c": [
                          {
                             "field_c_a": "value_c_a_1",
                             "field_c_b": "value_c_b_1"
                          }
                       ]
                    },
                    {
                       "field_a": "value_a_2",
                       "field_b": "value_b_2",
                       "field_c": [
                          {
                             "field_c_a": "value_c_a_2",
                             "field_c_b": "value_c_b_2"
                          }
                       ]
                    }
                 ]
              }
           }
        ]
     }
  }
 类似资料:
  • 我有一个弹性搜索索引集合,如下所示, 现在我需要通过将与其值匹配来搜索文档。(是一些字段,其值存储在中)例如。对于字段,如果它是,则应与上述文档匹配。 我尝试将其映射为嵌套对象,但我无法编写查询来搜索与其相应值匹配的2个或更多的键id。

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

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

  • 我有几个产品的变化,像下面的一个 我正在寻找一个具有以下所有参数的查询 获取某个类别中的所有产品 获取所有黑色的产品 获取尺寸l和M 我当前的查询: 它的工作很好,如果我只搜索1个大小。但是一旦我搜索了2个尺寸,它就不会给出任何记录。我的猜测是,它在每个嵌套变体中寻找所有3个参数,显然它找不到。如何修改要搜索的查询 null 我的第二个问题:

  • null 当然有更好的方法吗?

  • 我正在尝试使用C#使用Nest进行匹配查询。Match查询不会返回任何结果,因为生成的JSON的语法似乎不正确,我确信有一些文档包含此关键字。下面是C代码片段 这将生成以下查询: 但是,当我在Kibana控制台Get\u search中调整同一查询时,该查询返回0个结果 我得到搜索词的结果。请注意,Kibana查询的语法中缺少“第二个查询标记”。 我确实检查了文档,似乎我的语法是正确的https: