私は現在、自分の目的に合わせて Lucenes MoreLikeThis の修正版に取り組んでいます。まだ理解できないことが一つあります。キューを作成するとき、MoreLikeThis は、この用語の docFreq が最も高いフィールドを検索します。
// 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 で使用されます。これにより、奇妙な結果が生じる可能性があります。
たとえば、「タイトル」と「本文」の 2 つのフィールドがあり、まったく同じタイトルのドキュメントが 2 つあるとします。ただし、「タイトル」のすべての単語は他のドキュメントでより頻繁に出現するため、それらは一致しません。 「体」、およびその逆。それは私にはかなり奇妙に思えます。
別の例: ユーザー依存のアクセス許可によって結果をフィルター処理するシステムで使用すると、クエリが生成されたユーザーが、選択したフィールドの高い docFreq の原因となったドキュメントを表示できなかったことが起こりました。生成されたクエリはドキュメントを見つけられませんでしたが、ユーザーが見ることができるドキュメントはたくさんあり、正確な用語が間違ったフィールドに含まれているだけでした。
すべての分野、または少なくともその用語が最初に出現した分野だけを使用しないのはなぜだろうか。確かに、それはパフォーマンスの問題かもしれません。しかし、元のドキュメントで用語が出現するすべてのフィールドと、docFreq が最も高いフィールドを使用するように実装しました。数千のドキュメントを含むインデックスでテストしましたが、違いは見られませんでした (ただし、ベンチマークは行いませんでした)。
では、なぜこのように実装されているのか、誰か教えてもらえますか? 私が考えることができる唯一の理由は、多くのフィールドを持つ非常に大きなインデックスでパフォーマンスを発揮することです。
//編集: 問題を明確にするために最初の例を実装しました: http://pastebin.com/fwdENb3F