2

Lucene.Net を使用するアプリケーションには、整数を格納する数値フィールドがあります。値のカーディナリティはかなり低くなります (通常、異なる値は 20 ~ 30 未満)。

このフィールドに対して (contrib パッケージを使用して) ファセット検索を行いたいと思いSimpleFacetedSearchます。つまり、個別の値ごとのヒット数が必要です。

現在、追加のテキスト フィールドに値のコピーをそのまま保存しており、このテキスト フィールドに対してファセット検索を実行しています。これにより、正しい結果が返されます。

しかし、これは行くべき道ですか、それとも NumericFields に対してファセット検索を行う特別な方法はありますか?

注: カーディナリティが低いため、precision-step を int.MaxValue に設定して、値ごとに 1 つの項のみが存在するようにすることを検討してください。その場合、数値フィールド自体でファセット検索を簡単に実行し、 を使用して手動で値をデコードできると思いますNumericUtils.PrefixCodedToInt()。これは正しいですか、それとも合併症がありますか? これまでのテストでは、正常に機能することが示されました。

4

1 に答える 1

0

ファセットの値を別のフィールドに格納するのは理にかなっているように思えます。数値フィールドは、文字列フィールドにステミングと類義語展開が適用されているように、変更された値と考えることができます。このような場合、検索用に 1 つのフィールド、ファセット用に 1 つのフィールドで問題ありません。

マングルされたフィールド(NumericFieldによって生成された)でファセットを計算し、PrefixCodedToInt説明どおりに呼び出して、同じ結果を得ることができます。これにより、インデックスのサイズが削減されます (数値を格納したり、個別にインデックスを作成したりする必要はありません)。ハード ドライブでドキュメントを検索する代わりに用語インデックスから値を読み取ることができるため、io の負荷も軽減される可能性がありますが、これはインデックス サイズ、ファイル システム キャッシュなどに大きく依存します。

于 2013-05-04T09:14:43.383 に答える