2014-12-19 2 views
0

현재 다양한 형태의 액세스 제어를 기반으로 검색 결과를 필터링하기 위해 Java로 작성된 기본 스크립트를 사용하고 있습니다. 문제는 액세스 제어 확인이 레코드 당 우스운 시간을 필요로한다는 것입니다. 다소 개선 할 수있는 몇 가지 방법이 있지만 대폭 개선 할 수있는 해결 방법을 생각해 냈습니다. 유일한 문제는 제가 원하는대로 할 수 있는지 확신 할 수 없다는 것입니다.ElasticSearch의 기본 스크립트에서 페이징 데이터에 액세스

해결책 : 관련된 결과 수가 발견되면 액세스 제어 평가를 중단해야합니다.

문제점 : 최소 결과에 도달했을 때를 결정하기 위해 스크립트 내에서 오프셋 및 페이지 크기에 액세스하는 방법을 알아낼 수 없습니다 (지금은 AbstractSearchScript 구현). 누구든지 스크립트의 별도 매개 변수를 만들지 않고이 데이터를 "적절하게"얻는 방법을 알고 있습니까?

보너스 : 실제 히트 수보다 비슷하거나 큰 히트 수를 반환해야합니다. elasticsearch는 쿼리 결과를 캐시하지 않기 때문에 모든 결과에 대해 true를 반환하면 문제를 해결할 수 있습니다. 하지만 지금까지 데이터의 비율이 어느 정도인지에 따라 남은 여러 가지 결과를 반환하는 Google과 가까운 솔루션을 개발하고 싶습니다. 그러나이 작업을 수행하고 잠재적 인 합병증을 피하기 위해 히트 데이터를 직접 수정하고 싶습니다. 스크립트에서이를 수행 할 수있는 방법이 있습니까?

답변

0

직접 구현하려고하는 것이 아니라 ES 1.4에 도입 된 "terminate_after"매개 변수를 사용해야합니다.

"보너스"의 경우 ACL없이 쿼리를 두 번 실행합니다.

+0

당신이 이것을 언급한다고 가정합니다. http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-body.html "size"와 "terminate_after"의 실제 차이점은 무엇입니까? (죄송합니다. 문서는별로 좋지 않습니다.) – Shaman

+0

"terminate_after"는 Shard 단위이고 "size"는 수집 서버에 있습니다. 4 개의 파편이 있고 크기를 100으로 설정하면 각 파편은 수집자에게 100 개의 결과를 제공합니다. 그러면 수집자가 불필요한 300 개를 버리고 버립니다. 모든 파편의 품질이 동일한 것으로 믿을만한 이유가 있다면 size = 100 & terminate_after = 25, 각 조각은 대략 25 %의 작업을 수행합니다. –