2013-02-18 1 views
8

ES의 더 많은 "정규화 된"데이터에 대해 중첩 쿼리를 실행하는 개념 증명을 실행 중입니다.중첩 대 상위/하위 문서에 대한 확장

> - - 중첩 된

고객과 이메일 - -
이름을 이벤트 -> 을 - 생성 - 유형 이제

내가 특정 고객에 대한 이벤트 목록이 다른 이동 될 수있는 상황이 고객. 예 : 고객 A는 고객 B는 가

내가 지금 UI에서 그래프이 실행하는 고객의 수백만 쿼리 규모에서 고객 B

으로 고객 A로부터 모든 이벤트를 이동하려면 5000 개 이벤트

입니다있다 (50 개) 이벤트가 부모/자식이 더 적합하거나 그것을 처리 할 수 ​​있어야합니까?

내 상황에서 장단점은 무엇입니까?

답변

18

"중첩은 충분합니다."와 같은 거친 성능 메트릭을 제공하기는 어렵지만 도움이 될 수있는 중첩 대 상위 항목에 대한 세부 정보를 제공 할 수 있습니다. 나는 여전히 성능을 인정할 수있는 몇 가지 벤치 마크 테스트를 수행하는 것이 좋습니다.

중첩

  • 문서가 중첩/쿼리 성능을 판독하는 데 도움이 서로 동일 루씬 블록에 저장된다. 중첩 된 문서를 읽는 것이 동등한 부모/자식보다 빠릅니다.
  • 중첩 된 문서 (상위 또는 중첩 된 하위)의 단일 필드를 업데이트하면 ES가 중첩 된 문서 전체를 강제로 다시 인덱싱합니다. 이것은 큰 중첩 된 문서에 대해 매우 비쌀 수 있습니다.
  • "상위"를 변경하면 ES가 수행한다는 것을 의미합니다. 오래된 문서를 삭제하고, 중첩 된 데이터가 적은 오래된 문서를 다시 색인화하고, 새 문서를 삭제하고, 새 중첩 된 데이터로 새 문서를 다시 색인화합니다.

부모/자식

  • 아이들은 부모로부터 별도로 저장됩니다,하지만 같은 파편에 연결됩니다. 따라서 부모/자식은 읽기/쿼리의 성능이 중첩 된 것보다 약간 적습니다.
  • ES에 메모리에 "조인"목록이 유지되므로 부모/자식 매핑에 약간의 메모리 오버 헤드가 있습니다.
  • 자식 문서를 업데이트해도 부모는 영향을받지 않습니다 또는 기타 다른 하위 항목으로 큰 문서에서 많은 색인을 저장할 수 있습니다.
  • 상위 항목을 변경하면 이전 하위 문서를 삭제 한 다음 새 상위 항목 아래에서 동일한 문서에 대한 색인을 생성합니다.

네스트는 정상적으로 작동하지만 "데이터 셔플 링"이 많이 발생할 가능성이 있다고 생각되면 부모/자식이 더 적합 할 수 있습니다. 중첩 된 데이터는 자주 업데이트되지 않지만 자주 읽는 인스턴스에 가장 적합합니다. 학부모/자녀는 데이터가 더 자주 이동하는 배치에 더 좋습니다.

+0

http://www.elasticsearch.org/guide/reference/api/updatehtml은 부분 업데이트가 0.20 이래로 가능하다고 제안하는 것 같습니다. : "업데이트 API는 또한 기존 문서 (간단한 재귀 병합, 객체의 내부 병합, 핵심"키/값 "및 배열 교체)에 병합되는 부분 문서 (0.20부터)를 전달할 수 있습니다." –

+5

인터페이스에만 적용됩니다 (예 : 최종 사용자가 전체 문서를 제공하지 않고 필드를 업데이트 할 수 있음). 내부적으로 Lucene은 _source (삭제해야 함)에서 삭제 한 후 다시 색인을 생성합니다. Lucene은 초기 문서 작성 중에 연속 블록을 작성하고 임의 액세스 작성은하지 않으므로 갱신만으로는 불가능합니다. 삭제조차도 실제로는 삭제되지 않으며, 다음 병합이 삭제 될 때까지 삭제 된 것으로 표시됩니다. – Zach

+1

설명서에서 "부모 문서를 다시 인덱싱하지 않고 업데이트 할 수 있습니다." 따라서 "부모 변경하기"는 기존 자식 문서를 삭제 한 다음 새로운 부모 아래에서 동일한 문서를 색인에 추가한다는 것을 의미합니다. 구식입니다. https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child.html을 참조하십시오. –