2012-11-21 2 views
4

현재 내 자신의 목적에 맞게 Lucenes MoreLikeThis의 수정 된 버전을 작업 중입니다. 아직 이해할 수없는 것이 하나 있습니다. 대기열을 만들 때 MoreLikeThis는이 용어에 대해 가장 높은 docFreq가있는 필드를 검색합니다.Lucene의 기타 제한 이유는 가장 높은 docFreq를 가진 필드에 TermQueries입니까?

// go through all the fields and find the largest document frequency 
String topField = fieldNames[0]; 
int docFreq = 0; 
for (int i = 0; i < fieldNames.length; i++) { 
    int freq = ir.docFreq(new Term(fieldNames[i], word)); 
    topField = (freq > docFreq) ? fieldNames[i] : topField; 
    docFreq = (freq > docFreq) ? freq : docFreq; 
} 

이 필드는 TermQuery에서 사용됩니다. 이로 인해 이상한 결과가 발생할 수 있습니다.

예를 들어 "title"과 "body"라는 두 개의 필드가 있고 제목이 동일한 두 개의 문서가 있다고 가정하되 "제목"의 모든 단어가 더 많이 나오기 때문에 일치하지 않습니다 종종 다른 문서의 "본문"에 있고 그 반대의 경우도 마찬가지입니다. 그것은 나에게 꽤 이상하게 보인다.

또 다른 예 : 사용자 종속 액세스 권한으로 결과를 필터링하는 시스템에서이 쿼리를 사용하면 쿼리가 생성 된 사용자가 다음과 같은 높은 docFreq를 담당 한 문서를 볼 수 없습니다. 선택한 필드. 생성 된 쿼리는 문서를 찾지 못했지만 정확한 용어가 포함 된 많은 문서가 잘못된 필드에 포함되어있었습니다.

나는 왜 그들이 모든 필드를 사용하는지, 또는 적어도 용어가 원래 있던 필드를 사용하지 않는지 궁금합니다. 물론 성능 문제 일 수 있습니다. 하지만 필자는 원본 문서에서 용어가 나오는 모든 필드와 가장 높은 docFreq가있는 필드를 모두 사용하도록 구현했습니다. 수천 개의 문서가있는 인덱스에서 테스트했는데 차이점을 볼 수 없었습니다 (하지만 벤치 마크는 수행하지 않았습니다).

그래서이 방법으로 구현 된 이유는 누구에게 말해 줄 수 있습니까? 내가 생각할 수있는 유일한 이유는 많은 필드가 포함 된 정말 큰 지수에서 공연하는 것입니다.

// 편집 : 당신은 모든 용도에 맞지 않는 참조 구현으로 MoreLikeThis을 확인해야 http://pastebin.com/fwdENb3F

답변

2

: 나는 문제를 명확히하기 위해 첫 번째 예제를 구현했습니다. 구현에서 하나의 필드 만 대상으로 지정하면 제목 필드 만 검색하는 이유와 두 책의 문서가 동일한 작성자라는 사실을 완전히 놓치고있는 이유와 같은 질문이 표시됩니다.
setFieldNames을 사용하여 유사성을 찾을 필드를 설정할 수 있습니다.

자신 만의 MoreLikeThis 버전을 만드는 것이 가장 좋은 방법 인 것 같습니다. 특히 ACL을 고려해야한다고 생각하면됩니다.

+0

답장을 보내 주셔서 감사합니다. setFieldNames를 사용하면 고려할 필드를 지정할 수 있으므로이 중 가장 높은 docFreq가있는 필드가 계속 사용됩니다. 나는 "왜"에 대해 냉담했지만, 대부분의 목적에 꽤 잘 작동하는 것처럼 보이기 때문에 나는 그것을 받아 들여야한다고 생각한다;) –

관련 문제