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