0

私は次のことを行おうとしています。各フィールドに個別にクエリを実行し、このセットに上位k個の一致を追加して、候補のセットを作成したいと思います。それが終わったら、この候補セットに対して別のクエリを実行する必要があります。私が今それを実装した方法は、各候補ドキュメントの一意のIDフィールドに一致するBooleanQueryでQueryWrapperFilterを使用することです。ただし、これは、主要なボトルネックであるBooleanQueryに追加する前に、候補ドキュメントごとにIndexSearcher.doc()。get( "docId")を呼び出す必要があることを意味します。MapFieldSelector( "docId)を介してdocIdフィールドをロードするだけです。

独自のFilterクラスを作成したかったのですが、セグメントごとに指定されているため、内部のLuceneドキュメントIDを直接使用することはできません。これにアプローチする方法について何か考えはありますか?

4

1 に答える 1

1

保存されたdocIdを読み取る代わりに、フィールドにインデックスを付け(おそらくすでにそうなっています)、FieldCacheを使用してdocIdをはるかに高速に取得します。次に、BooleanQueryでdocIdを使用する代わりに、TermsFilterまたはFieldCacheTermsFilterを使用してみてください。後者のドキュメントでは、パフォーマンスのトレードオフについて説明しています。

于 2012-05-16T23:21:30.800 に答える