2011-10-14 4 views
2

일부 필드에서는 전체 텍스트 검색이 필요하고 다른 필드에서는 기본 제한이 필요한 복잡한 쿼리가 있습니다. 최대 절전 모드 검색 설명서 strongly advises against 전체 텍스트 검색 쿼리에 데이터베이스 쿼리 제한을 추가하고 모든 필드를 전체 텍스트 인덱스에 추가하는 recommends. 내가 가진 문제는 다른 분야는 휘발성이다. 값은 매분마다 변경 될 수 있으며 데이터베이스에 대한 업데이트는 검색을 수행하는 JVM 외부에서 발생할 수 있으므로 로컬 Lucene 색인이 해당 필드와 관련하여 유효하지 않을 가능성이 높습니다.관계형 데이터베이스 쿼리로 Hibernate 검색 결과 병합

여기에 전략 권장 사항이 있습니다. 내가 지금까지 생각해 낸 최선의 방법은 데이터베이스 쿼리를 먼저 실행하고 (개체 ID 만 가져 오기) 결과를 수동으로 조인 한 다음 전체 텍스트 검색을 실행하는 것입니다. 어떻게하면 데이터베이스의 객체 ID 집합으로 Lucene 결과를 필터링 할 수 있습니다. 물론 각 개별 쿼리에서 얼마나 많은 결과를 얻을지 모르겠으므로 성능과 메모리가 걱정됩니다. 최악의 경우 수만 행이 될 수 있습니다.

답변

0

저는 우리가 매우 비슷한 시나리오를 가지고 있기 때문에 이것을위한 다른 아이디어에 상당히 흥미가 있습니다.

우리는 행당 2 개의 조회로 50 개의 결과 행을 최대로 표시해야했습니다. 인덱스의 db pk id를 사용하여 lucene 인덱스에 대해 쿼리를 실행하고 행마다 데이터베이스에서 조회를 가져옵니다. 그것은 여전히 ​​우리에게 적합합니다.

몇 가지 행 및 조회 이상을 처리하려는 것처럼 나는 대안을 고려했습니다. 모든 DB 행 업데이트를 타임 스탬프합니다. 이렇게하면 부실 인덱스에 대해 DB를 쿼리 한 다음 관련 문서의 인덱스를 반복적으로 호출 할 수 있습니다.

0

동일한 문제가 있으며 별도의 Lucene 및 조건 쿼리를 수행합니다. 먼저 기준 쿼리를 수행하면 그 결과 ID를 사용하여 결과가 첫 번째 쿼리의 주어진 Id 컬렉션에 있는지 확인하는 Lucene 검색 용 사용자 지정 IdFilter를 적용합니다. 그러나이 방법은 확장 성이 좋지 않습니다. 제 경우에는 첫 번째 쿼리 이후의 결과 수가 많고 필터가 1024 개의 ID로 제한되기 때문입니다. 나는 좋은 해결책을 찾지 못했지만 예상되는 결과의 수에 따라 두 가지 쿼리의 순서를 변경합니다. 첫 번째 쿼리는 대부분의 결과를 걸러내는 쿼리 여야합니다.

0

최종 수정 날짜에 스케줄러 색인 업데이트 기준을 수행 할 수 있습니다.