2009-08-16 1 views
5

색인을위한 모든 검색 가능한 필드를 함께 포함하는 서로 다른 필드를 갖고있는 두 개의 개별 인덱스가 있습니다. 예를 들어 첫 번째 색인은 모든 문서에 대해 색인 된 텍스트를 보유하고 두 번째 색인은 모든 문서에 대한 태그를 보유합니다.2 개의 다른 (샤 르드되지 않은) Lucene 인덱스의 일치 항목을 병합하는 방법

아래 예제는 엔티티의 이름을 변경했기 때문에 다소 실망 스럽습니다. INDEX1 : 텍스트 문서 ID

Index2 : 태그 이름 : "매우 중요" 사용자 : "프레드의 ID"

가 지속적으로 업데이트에 낭비 보인다 내가 인덱스를 별도로 보관하고 싶은 사용자가 태그를 추가/제거 할 때마다 단일 색인.

지금까지 두 개의 검색 결과를 처리하고 수동으로 (코드에서) 병합해야한다고 생각합니다. 다른 제안 사항이 있습니까?

별도의/샤드 인덱스를 병합하고 싶지 않습니다.

+0

색인에 저장된 태그가 필요한 이유가 있습니까? 이 정보를 관계형 데이터베이스 (예 : MySQL 또는 SQL Server)에 저장하고 인덱스에 고유 ID를 저장하는 것이 어떻습니까? – jeremyalan

+0

@Phoenix - 두 인덱스에 걸쳐있는 쿼리를 실행할 수 있기를 원하기 때문입니다. –

답변

4

루씬이 배치 — ParallelReader을 지원 IndexReader의 형태를 갖는다.

레코드의 Lucene 문서 식별자가 두 인덱스에서 동일해야하므로 사용하기가 다소 어려울 수 있습니다. 실제로 이것은 두 색인에 같은 순서로 문서를 추가하는 것을 의미합니다. 일부 경우 문서 삭제 및 색인 최적화로 인해 Lucene이 이러한 문서 식별자를 재 할당 할 수 있다고 읽었지 만 이것이 사실인지 알아보기 위해 실험하지는 않았습니다. 기존 기록을 수정하는 경우 추가 치료가 필요할 수 있습니다. 새 레코드 만 추가하면 아무런 문제가 없어야합니다.

이 접근법은 일반적으로 "수평 분할"또는 샤딩과 달리 "수직 분할"이라고합니다.

+0

두 경우 모두 문서 ID가 일치하기를 바랍니다. 제대로 관리하고 싶습니다. –

+0

문서가 색인에 추가 될 때 문서 ID가 일치하기 만하면되는 것은 아닙니다. ID는 단순히 일련 번호입니다. 나에게 명확하지 않은 점은 Lucene이 삭제 된 레코드의 비율이 높은 인덱스를 "압축"하기 위해 문서 ID를 재 할당할지 여부입니다 (Lucene의 "업데이트"는 원본 레코드 삭제 후 "업데이트 됨 "기록). – erickson

+0

"시퀀스 번호"는 "문서 ID"보다 실제 정의에 더 가깝지만 실제로는 "오프셋"입니다. 인덱스가 최적화되고 삭제 된 문서가 물리적으로 기본 인덱스 파일에서 제거되면 (인덱스의 조각화 해제와 같은 일종), 이러한 오프셋이 변경되며이를 쉽게 찾을 수 없습니다. 이 문제에 대한 가장 일반적인 해결책은 Lucene 문서의 "id"필드에 고유 한 ID를 저장하는 것입니다. – jeremyalan

0

코드에서 색인을 병합해야하는 것처럼 보입니다. 내가 올바르게 이해하면 용어를 검색 할 때 문서 텍스트 나 태그와 일치 할 수 있으며 각 태그는 관련 문서 ID로 색인화됩니다. 그런 다음 두 개의 히트 목록을 병합합니다. 태그와 전문은 매우 다른 엔티티이므로 좋은 순위에 도달하려면 가중치가 필요합니다 (검색 중에 필드 높이기 등).

score(k) = a*tagscore(k)+b*fulltextscore(k)

을 경우 A와 B는 경험적으로 결정 계수 될 것입니다 : 따라서, 당신은 태그가 공격 및 전체 텍스트가 같은 공식을 사용하여 문서 k에 대한 공격 병합 할 수 있습니다.

자세한 내용은 Grant Ingersoll의 findabilitydebugging relevance issues in search 논문을 참조하십시오.

+0

병합은 부울 쿼리 경계에 있으므로 득점은 문제가되지 않습니다. 진짜 질문은 수색을하는 방법의 점에서 남아 있습니다. –

+0

@mP : 명확히하십시오. 두 인덱스에 문서 당 고유 ID를 저장하면 검색에 아무런 문제가 없습니다. 나는 랭킹/득점 문제를 보았습니다 - 문서 텍스트에서 1000 회의 히트를 얻었고 태그에서 2000 회의 히트를 얻었 으면 상위 20 위 정도를 표시하고 싶을 것입니다. 이것은 득점이 중요한 부분입니다. –

0

기본 알고리즘 (그리고 아마도 대부분의 사용자 지정 알고리즘, 예외는 있지만)은 용어 빈도 및 역 문서 빈도를 기반으로하기 때문에이 방법의 주요 문제는 문서 순위와 관련이 있습니다.

즉, Scorer는 문서 내에 용어가 나타나는 횟수와 용어가 포함 된 다른 문서의 수를 알아야합니다. 이 정보는 인덱스의 각 용어에 대해 저장되지만 여러 인덱스에 대한 집계는 저장되지 않습니다.

이 문제에 대한 일반적인 해결책은 2 단계 접근 방식입니다. 먼저 각 인덱스에 대해 쿼리를 실행하여 각 용어가 포함 된 문서 수를 확인합니다.그런 다음 결과가 집계되고 쿼리가 다시 실행되지만 이번에는 역 문서 빈도가 함께 전송됩니다.

이것은 상상할 수있는 것처럼 하나의 인덱스에 대해 쿼리를 실행하는 것뿐만 아니라 아무 것도 무료가 아니기 때문에 여러 인덱스에 문서를 저장하는 것이 트레이드 오프라고 생각합니다.

관련 문제