2012-07-22 2 views
2

문서를 선택적으로 사용자 ID에 연결할 수있는 데이터 세트가 있습니다. 문서가 책을 대표하고 각 책에 하나 이상의 소유자가있을 수 있다고 가정 해보십시오. 검색 할 때, 내가 소유하지 않은 책에 매칭되기 전에 내가 소유하고있는 책에 매치하고 싶습니다. 그런 다음, 나 소유의 모든 결과를 소유하지 않은 결과가 나오기 전에 결과 상단에서 정렬되도록합니다. 나는 그래서 13 또는 19 (소유 한 것보다 나를 먼저 소유 책을 찾으려면 Lucene : "소유"문서에 대한 관계 검색을위한 쿼리 또는 필터?

Owner ID    Book Title 
--------    ---------- 
13     To Have and To Have Not 
14     To Have and To Have Not 
19     To Have and To Have Not 
15     Snow Crash 
17     Snow Crash 
18     Cryptonomicon 
14     Of Mice And Men 

내 사용자 ID가 14임을 말해 나는 "이"를 검색 : 그래서 데이터처럼 보일 수 있습니다 내가 소유하고 있기 때문에 목록의 맨 위에 정렬하는 것을 알고 있습니다.) 그러나 "크래시"를 검색하면 내가 소유하지 않은 도서에도 해당 도서 중 하나를 찾고 싶습니다. 내가 그 (것)들을 소유하지 않기 때문에, 그들은 종류에서 더 낮게 나타날 것입니다. 따라서 "a"에 퍼지 검색을 수행하면 목록 상단에 나와있는 모든 일치하는 책을 볼 수 있으며 나머지는 나중에 볼 수 있습니다.

쿼리, 필터 또는 둘다에 조금 붙어 있습니다. 예를 들어 필자는 모든 중복 된 제목을 제거하고 소유하고있는 제목을 선호하는 필터를 작성한 다음 나머지는 간단한 검색 만 수행 할 수 있습니다 (검색 전에 필터가 적용된다고 가정). 그런 다음 소유자를 기반으로하는 사용자 정의 정렬은 간단합니다.

하지만 필터를 구현하는 방법을 잘 모르겠습니다. 그것은 두 필드에서 작동하기 때문에 간단한 DuplicateFilter가 아닙니다. Lucene in Action의 5.6.7 절에있는 보안 필터 예제와 비슷합니다. 단, 동일한 제목의 책이없는 경우에도 내가 소유하지 않은 문서를 볼 수 있기를 원한다는 점이 다릅니다. 섹션 6.4의 사용자 정의 필터도 비슷하지만 두 필드에 의존하기 때문에 문제가 더 복잡합니다.

문서를 반복하면서 필터는 어떤 제목이 표시되었는지 기억하고 내가 소유 한 제목을 유지해야합니다. 예를 들어, 위의 값들을 순서대로 반복한다면, "소유하고 가지고 있지 않다"는 제목을 볼 수 있습니다. 나에게 소유 된 동일한 제목을 다시보고 첫 번째 문서를 삭제하고 두 번째 문서를 유지해야한다는 것을 알아야합니다. 나는 많은 메모리를 사용하지 않고이 작업을 수행하는 방법을 생각할 수 없다. 반복적으로 모든 타이틀을 메모리에 유지하는 것은 매우 비싸다. 일치하는지 여부는 세트의 다른 문서에 따라 다르므로 단순한 "일치"기능이 아닙니다.

안내 또는 정보를 제공해 주셔서 감사합니다.

+1

간단하게 소유자 필드에 큰 쿼리 시간 증가를 넣으려고 했습니까 (각 소유자에 대해 별도의 책이 아닌 다중 값 필드 소유자가 있습니까?). –

답변

0

두 개의 문서가 동일한 점수를 갖는 경우 '우선 순위 소유자'가있는 문서가 검색 결과의 첫 번째 목록에 표시됩니다.

+0

부스트 (Boost)를위한 좋은 케이스가 아닐까요? – robbymurphy