2014-11-03 4 views
6

Основной вопрос заключается в следующем: Есть ли удобный способ задать многополевое соответствие для всех полей для вложенного запроса? Для обычного запроса { match : { _all : "query string" }} работ. Это не работает во вложенном запросе, возможно потому, что вложенный объект не имеет _all?Создание вложенного запроса elasticsearch для соответствия по всем полям вложенного объекта

Более подробный вопрос ниже:

У меня есть вложенный документ, который называется «Родитель» следующим образом:

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

Запрос выше работает, так как сопоставление с образцом позволяет * быть помещены перед строкой, но не после того, как по какой-то причине (?)

Есть хороший сокращенный способ, чтобы выбрать все поля вложенный объект?

Было бы также полезно знать, почему ожидаемые дети. * Wildcard не работает должным образом.

ответ

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" 
          } 
         ] 
        } 
       ] 
       } 
      } 
     ] 
    } 
    } 
Смежные вопросы