2014-11-03 1 views
6

기본 질문은 다음과 같습니다. 중첩 된 쿼리의 모든 필드에 여러 필드 일치를 지정하는 편리한 방법이 있습니까? 일반적인 쿼리의 경우 { match : { _all : "query string" }}이 작동합니다. 중첩 된 개체에 _all이 없기 때문에 중첩 된 쿼리에서이 기능이 작동하지 않습니다. 아래중첩 된 객체의 모든 필드에서 일치를 위해 elasticsearch 중첩 쿼리 만들기

더 자세한 질문은 다음과 같습니다

나는 "부모"라는 중첩 된 문서가 :

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

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

이것은 내가 아이들 중첩 된 개체를 만드는 데 사용 매핑입니다

다음은 모든 하위 필드 검색어와 일치하는 검색어를 사용하여 몇 가지 용어를 선택하려는 검색어 및 검색어입니다.

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