1

Lucene クエリの一部として、N 未満の用語を含むドキュメント、または特定のサイズより小さいドキュメントを結果から除外することは可能ですか?

全文: 多くのドキュメントを含む Lucene インデックスがあります。それらのいくつかは大きく、他のものは非常に小さく、おそらく数語だけです. いくつかのテストを実行したいのですが、妥当なサイズのドキュメントに対してのみです。小さなドキュメントを除外するにはどうすればよいですか? 現在、用語の頻度ベクトルをフェッチし、N 未満の用語を含むドキュメントをドロップしています。

BooleanQuery q = some query...
TopDocs top = indexSearcher.search(q, size);
Collection<Integer> docNums = collectDocNums(top);
Iterator<Integer> it = docNums.iterator();
while (it.hasNext()) {
  int candDocNum = it.next();
  TermFreqVector tfv =
    indexReader.getTermFreqVector(candDocNum, "field");
  if (tfv.getTerms().length < N)
     it.remove();
}

クエリ自体をフィルタリングするか、その下のループを何らかの方法でバッチ処理することにより、これをより効率的に行うことができますか?

4

2 に答える 2

1

フィルターはおそらく合理的な実装です。このようなフィルタは検索中に頻繁に再利用されるように思われるため、キャッシュ フィルタを使用する価値があります。これを実現する標準フィルターは知りませんが、カスタム フィルターはうまく機能します。

私は次のようなものを実装します:

//Important to wrap the filter with a CachingWrapper, for performance.
filter = new CachingWrapperFilter(new CustomFilter());

public class CustomFilter() Extends Filter{
    public getDocIdSet(IndexReader reader) {
        return new CustomSet(reader);
    }
}

public class CustomSet(IndexReader reader) extends FilteredDocIdSet{
    public boolean match(int docid) {
        reader.getTermFreqVector(candDocNum, "field");
        return (tfv.getTerms().length >= N);
    }
}
于 2012-12-19T20:53:26.807 に答える
0

PositiveScoresOnlyCollectorを見てください: を持つドキュメントのみを収集しますscore > 0。を持つドキュメントのみを受け入れる独自の同様のコレクターをおそらく作成できますscore > X

Nもちろん、上記は と の間に何らかの関係が見られる場合にのみ適用できますX。私の理解では、これら 2 つのことは相関しているはずです。一致する用語が少ないほど、スコアは低くなり、その逆も同様です。

最小スコアしきい値を定義できる場合、このアプローチは現在使用しているアプローチよりも効率的です。

于 2012-12-17T11:03:50.347 に答える