2014-09-26 6 views
0

나는 elasticsearch 선수 인덱스에 다음과 같은 물건이 있습니다.탄성 검색 : 배열로 검색

GET /players/_search 

"hits": [ 
    { 
     "_index": "players", 
     "_type": "1", 
     "_id": "rRI5A8mVRUKKTA08bK90Vw", 
     "_score": 0.2712221, 
     "_source": { 
      "id": "1", 
      "first_name": "Lebron", 
      "last_name": "James", 
      "numbers": [ 
       { 
       "number": "23", 
       "team": { 
        "city": "Cliveland", 
        "name": "Cavaliers" 
       } 
       }, 
       { 
       "number": "6", 
       "team": { 
        "city": "Maimi", 
        "name": "Heat" 
       } 
       } 
      ] 
     } 
    } 
    ] 

이제는 "maimi"에서 플레이하고 번호가 "23"인 플레이어를 검색하고 싶습니다 (이 색인에는 해당 플레이어가 없습니다). 시도 했음

GET /players/_search 
{ 
    "query": { 
     "bool" : { 
      "must" : [ 
       { 
        "term" : { 
         "numbers.number" : "23" 
        } 
       }, 
       { "term" : { 
         "numbers.team.city" : "maimi" 
        } 
       } 
      ] 
     } 
    } 
} 

하지만 elasticsearch는 여전히 LeBron을 발견했습니다. 탄력적 인 검색에 대한 올바른 요청을 어떻게해야합니까?

답변

2

데이터 구조 및 색인 방법 : arrays inner objects은 내부적으로 병합됩니다.

사실, 문서는 다음과 같이 ElasticSearch에 색인 : 내부 객체 사이의

numbers.number:  [23,6] 
numbers.team.city: [Cliveland,Maimi] 
numbers.team.name: [Cavaliers,Heat] 

협회 비록 잃고도이 문서를 일치합니다 Cliveland 열 번호 6 찾고있다.

이 문제를 해결하려면 nested 개체 매핑을 사용해야합니다. 내부 개체는 그대로 유지됩니다.