【问题标题】:Making an elasticsearch nested query for match on all fields of nested object对嵌套对象的所有字段进行弹性搜索嵌套查询以匹配
【发布时间】:2014-12-30 13:20:08
【问题描述】:

基本问题如下: 是否有一种方便的方法可以为嵌套查询的所有字段指定多字段匹配? 对于普通查询{ match : { _all : "query string" }} 有效。 这在嵌套查询中不起作用,可能是因为嵌套对象没有 _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"]}}
                    ]
                }
            }
    } 
}

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

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

如果知道为什么预期的 children.* 通配符不能按预期工作也会很高兴。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    对我来说正常工作(注意:Elasticsearch 1.7)。请注意不同的名称(aparent,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"
                              }
                           ]
                        }
                     ]
                  }
               }
            ]
         }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多