2014-11-03 106 views
6

基本问题如下: 是否有一种方便的方法来指定嵌套查询的所有字段上的多字段匹配? 对于正常查询{ match : { _all : "query string" }}的作品。 这可能不会在嵌套查询中工作,因为嵌套对象没有_all?在嵌套对象的所有字段上进行弹性搜索嵌套查询

更详细如下问题:

我有一个名为“父”的嵌套文件如下:

{ 
    "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"]}} 
        ] 
       } 
      } 
    } 
} 

上面的查询工作,因为该模式匹配允许在字符串前放置一个*,但由于某种原因后(?)

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

也很高兴知道为什么期望的孩子。*通配符不按预期工作。

回答

0

正常工作给我(注: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" 
          } 
         ] 
        } 
       ] 
       } 
      } 
     ] 
    } 
    }