2012-06-21 4 views
0

나는 아주 간단한 질문이 있습니다.탄성 검색 검색 시간 일관성

나는 1600000 개의 비교적 큰 문서를 포함하는 elasticsearch 색인을 가지고 있으며, 색인을 스캔하여 고전적인 SQL 데이터베이스와 동기화해야합니다.

내 문서에는 SQL ID와 타임 스탬프가 포함됩니다.

SQL 데이터베이스와 탄성 색인을 동기화하려면 간단히 행과 문서를 순차적으로 읽습니다 (ID로 정렬 됨). ID를 비교하면 문서를 삭제해야하는지 (비교가 음수인지) 확인할 수 있습니다. SQL 행 (비교 긍정적 인) 새 문서, 그리고 비교가 0이면 내가 문서를 업데이 트 해야하는지 알고 타임 스탬프를 비교하십시오.

나는 작동하지만 나는 문서를 읽는 것이 내가 미리 읽는 것을 훨씬 느리게한다는 것을 관찰한다.

{ 
    "from" : 0, "size" : 10000, 
    "fields" : ["idannonce","ts"], 
    "sort" : ["idannonce"], 
    "query" : "match_all" {} 
} 

이 간단한 쿼리 할 때 "에서 많은 느린 :

나는 이런 식으로 뭔가를 요청 필드"에서 "때마다 이동, 인덱스에 검색을 반복하여 덩어리에서 내 문서를 검색 "이 0 일 때보다 1000000입니다.

이 정상적인 동작입니까? "idannonce"필드를 인덱싱해야하는 것과 대략 같은 시간이 걸릴 것이라고 생각했습니다.

의견이 있으십니까? 일정한 시간에 실행되도록 동일한 쿼리를 작성하는 방법이 있습니까?

감사합니다.

답변

1

검색 API는이 사용 사례를 위해 설계되지 않았습니다. 차선의 성능을 얻는 것 외에도 변경 사항이 인덱스에 적용될 때 검색 창을 "이동"하여 삭제 및 추가가 탄성 검색 결과를 방해하기 때문에 일부 변경 사항이 누락되었을 수 있습니다. 이 작업에 훨씬 더 적합한 Scroll API으로 전환해야합니다.

+0

나는 Scroll API를 사용하고 싶지만, 슬프게도 정렬은 지원하지 않는다. 검색 API를 사용하여 문서를 IDannonce별로 정렬 할 수 있습니다. 또한, 동기화 과정이 두 단계로 실행되므로 삽입/삭제가 누락되지 않습니다. 먼저 ID와 타임 스탬프를 사용하여 SQL DB와 탄성 인덱스 사이의 델타를 결정한 다음 SQL에서 델타에 대한 전체 데이터를 검색하고 필요에 따라 내 문서를 삽입/업데이트/삭제합니다. 이제 "from"이 높을 때 내 쿼리가 더 느리게 실행되는 이유를 이해할 수 없습니다. 어떤 생각? –

+0

스크롤은 일반적으로 정렬 검색을 지원하지 않는 검색 검색 유형과 함께 사용됩니다. 그러나 스크롤을 다른 검색 유형과 함께 사용할 수도 있습니다. 정렬하지 않고 모든 ID를 먼저 가져온 다음 클라이언트에서 정렬하는 것이 더 효율적일 수 있습니다. 속도 저하에 대한 질문에 대답하려면 elasticsearh가 더 많은 작업을 수행해야하기 때문에 더 많은 페이지를 검색하는 것이 더 느립니다. 색인이 여러 개의 조각으로 나뉘어져 있습니다. 맞습니까? 이제 서로 다른 노드에 5 개의 정렬 된 목록이 있으며 결합 된 목록에서 999,990에서 1,000,000까지 레코드를 가져와야한다고 생각해보십시오. 어떻게 할 건데? – imotov

+0

대단히 감사합니다. 검색 이외의 다른 검색 유형에서 Scroll API를 사용할 수 있다는 것을 몰랐습니다. 아마 다음주에 시도해 볼 것입니다. 지금은 범위 쿼리로 전환했습니다. 마지막으로 찾은 ID를 기억하고이 ID에서 검색을 다시 시작합니다. 이것은 너무 느리지 만 스크롤이 더 빠를 것이라고는 생각하지 않습니다. –

1

나는 비슷한 일을하고 있었지만 https://github.com/jprante/elasticsearch-river-jdbc이 더 유용하다는 것을 알았습니다. 매우 간단한 통합입니다. 이것을 사용해보십시오. 코드 요령을 게시하십시오. 또한 https://github.com/lukas-vlcek/bigdesk은 쿼리를 실행할 때 그래프를 관찰합니다.

+0

멋지다! 내가 꽤 구체적인 방법으로 데이터를 조작해야하기 때문에 나는 그것을 사용할 수 있다고 생각하지 않지만 jdbc 강은 내가 다른 작업을 위해 사용할 수있는 무언가이다. –