2016-07-17 2 views
0

Elasticsearch에는 정렬 및 페이지 매김이 기본적으로 지원됩니다. 그러나 중첩 된 객체 만 검색하고 페이지 매김을 만들고 필드별로 정렬하려면 어떻게해야합니까? 예를 들어 :중첩 된 문서 정렬 및 페이징

{ 
    "mappings" : { 
    "library" : { 
     "properties" : { 
     "name" : {"type": "string"}, 
     "books" : { 
      "type": "nested", 
      "properties" : { 
      "title" : {"type": "string"}, 
      "author" : {"type": "string"}, 
      "year" : {"type": "integer"} 
      } 
     } 
     } 
    } 
    } 
} 

어떻게 Elasticsearch을 요청할 수는 "나에게 year으로 분류 title= 'Elasticsearch'offset = 20books 10 첫째 줄"? 중첩 된 유형이 가능합니까? 아니면 더 느린 부모 - 자식 관계를 사용해야합니까?

답변

0

예, 가능합니다, 당신은 당신이 원하는 것을 달성하기 위해 nested inner hits를 사용할 수 있습니다

POST index/library/_search 
{ 
    "query" : { 
     "nested" : { 
      "path" : "books", 
      "query" : { 
       "match" : {"books.title" : "Elasticsearch"} 
      }, 
      "inner_hits" : { 
       "from": 20, 
       "size": 10, 
       "sort": {"books.year": "asc"} 
      } 
     } 
    } 
} 
+0

감사의 말, 'inner_hits'는 작동하지만, 중첩 된 객체는 상위 문서의 범위에서만 정렬 및 페이지 매김합니다. 그래서 쿼리 결과가 2 개의'library' 문서를 포함하고 있다면, 각각은 자신의'books'만으로 정렬 된 배열을 가지게됩니다. 그러나 달성하고자하는 것은 모든'books'가 매치 된 하나의 정렬 된 배열입니다. 그게 가능하니? –

+0

내가해야 할 일은 book 객체를 최상위 라이브러리 객체로 만들고 추가로'library_name' 필드를 추가하는 것입니다. 언급하지 않은 다른 요구 사항이없는 한'중첩 된 '유형을 사용할 필요가 없습니다. – Val

+0

실제 매핑은 더욱 복잡합니다. 우리는 '중첩 된'을 사용하여 '많은 것을 가진다'는 에뮬레이션을한다. 우리는 여러 개의 '다수 있음'필드가있는 문서를 가지고 있습니다 (그 중 일부는 하나도 가지고 있습니다). 우리는 데이터를 자주 변경하지 않으므로'중첩 된 (nested) '은 빠른 해결책이 될 것입니다. 유일한 stoper는 상위 범위에서 중첩 된 객체를 페이징/정렬하는 것입니다. 불가능하다면 다른 솔루션을 찾아야합니다. 당신의 이전 코멘트에 따르면, 나는'중첩 된 '것으로 내가 원하는 것을 얻을 수 없다, 맞습니까? –