4

私は現在、自分の目的に合わせて 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

4

1 に答える 1

2

MoreLikeThisすべての用途に適合するわけではない参照実装として表示する必要があります。実装が 1 つのフィールドのみを対象とした場合、次のような疑問が生じるでしょう: なぜタイトル フィールドのみを検索し、2 つの書籍ドキュメントの著者が同じであることを完全に見逃してしまうのか。setFieldNames
を 使用して、類似性を検出するフィールドを設定できます。

独自のバージョンのMoreLikeThisサウンドを作成することは、特に ACL を考慮に入れる必要があることを考えると、最良のアプローチのようです。

于 2012-11-25T23:25:42.600 に答える