2015-01-15 5 views
5

특히, 나는 페이지 매기기를 수행하기 위해 Elasticsearch를 사용하지만,이 질문은 모든 데이터베이스에 적용될 수 있습니다.원본 데이터가 자주 변경 될 때 페이지 매김을 처리하는 방법

탄성 설지는 fromto 매개 변수를 사용하여 paginate search results에 대한 방법을 제공합니다.

그래서 나는 쿼리 get me the most recent data from result 1 to 10

이 잘 작동을 실행합니다.

사용자는 "다음 페이지"를 클릭하고 쿼리는 다음과 같습니다 get me the most recent data from result 11 to 20

문제는 두 개의 쿼리 사이의 시간에, 2 개 개의 새로운 레코드가 매겨진 결과를 의미하는 기가 데이터베이스에 추가 된 것입니다 (첫 번째 페이지의 마지막 2 개는 두 번째 페이지의 처음 두 개로 표시됩니다).

이 문제를 방지하는 가장 좋은 해결책은 무엇입니까? 지금은 쿼리에 필터를 추가하여 이전 쿼리의 마지막 결과보다 나중에 결과 만 포함하도록 지정합니다. 그러나 그것은 단지 해커처럼 보인다.

답변

5

이미 관련 타임 스탬프를 인덱싱하고있는 경우 필터가 나쁜 옵션이 아닙니다. 쿼리를 올바르게 준비하려면 클라이언트 쪽에서 해당 타임 스탬프를 추적해야합니다. 언제 제거해야 하는지도 알아야합니다. 그러나 그것들은 극복 할 수없는 문제는 아닙니다.

Scroll API는 Elasticsearch 측에서 효과적으로 스냅 샷을 생성하기 때문에 솔리드 옵션입니다. Scroll API의 목적은 깊은 페이지 매김에 대한 안정적인 검색 쿼리를 제공하는 것입니다.이 쿼리는 발생하는 정확한 변경 문제를 처리해야합니다.

쿼리를 제공하고 scroll 매개 변수를 시작하여 Elasticsearch가 scroll_id을 반환하면 시작됩니다. 그런 다음 해당 ID를 제공하는 /_search/scroll에게 요청을하고 각각은 결과 페이지를 반환하고 다음 요청에 대해서는 새로운 scroll_id을 반환합니다.

(당신이이 scan 검색 여기에 입력하지 않으 합니다. 즉 문서를 추출하는 데 사용 한꺼번에, 및 정렬을 적용되지 않습니다.)

필터링에 비해 여전히해야합니까 값을 추적하려면 결과의 다음 페이지에 대해 scroll_id을 입력하십시오. 시간 소인을 추적하는 것보다 쉽지는 앱에 달려 있습니다.

고려해야 할 다른 잠재적 단점이 있습니다. Elasticsearch는 클러스터 내의 단일 노드에서 검색 컨텍스트를 유지합니다. 스크롤 검색에 얼마나 많은 의존을하고 있는지에 따라 클러스터에 누적 될 수 있습니다. 성능에 미치는 영향을 테스트하고 싶을 것입니다. 그리고 올바르게 호출 한 경우 스크롤링 검색은 노드 오류 또는 다시 시작을 통해 지속되지 않습니다.

Scroll API의 ES 설명서는 위의 모든 것에 대한 훌륭한 세부 정보를 제공합니다.

결론 : 타임 스탬프로 필터링하는 것은 실제로 나쁜 선택이 아닙니다. Scroll API는 비슷한 유즈 케이스를 위해 설계된 또 다른 유효한 옵션이지만 단점이 없습니다.

+0

자세한 설명을 주셔서 감사합니다. 웬일인지, 나는 scan/scroll이 같은 물건이었다라고 생각하고 있었다. 그러나 그것은 분명하게 사실이 아니다! 필터링 할 최신 타임 스탬프와 같은 것이 없으면 스크롤이 좋은 선택 인 것 같습니다. – bradvido

+0

타임 스탬프 필터링의 단점은 누군가가 문서를 삭제하는 경우 결과의 다음 페이지에서 문서가 반환되지 않도록 할 수 있다는 것입니다. – writofmandamus

+0

Scroll API 문서 '스크롤은 실시간 사용자 요청을위한 것이 아닙니다.', – Ben

-1

이 경우 스캔 API를 사용해야합니다. 스캔 및 스크롤 API를 사용하면 시간 검색 및 페이지 매김을 알려줍니다. 검색 API -

+1

스캔 API를 사용하는 것이 올바른 방법이 아닙니다. 결과에 대한 정렬은 적용되지 않습니다. – bittusarkar

관련 문제