0

Lucene クエリは次のように生成されます。

Query luceneQuery = builder.all().createQuery();

次に、ファセットが適用されます。

ファセットが適用されたときに、luceneQuery が他のクエリと AND および OR されて、新しい Lucene Query が生成されるかどうかはわかりません。または、結果を絞り込むために、元のクエリに一連の BitSet を適用することもできます。(知らない)。

新しいクエリが生成されたら、それを取得したいと思います。そうでない場合は、再考する必要があります。それが質問の核心です。

どうして:

複数の可能な値を持つフィールドにファセット検索を適用しています。

例: TMovie.class多対多TTag.class ( multiple-value-facet )

TTag が何らかの値である TMovie をフィルタリングしています。

とにかく、フィルタリングは機能しますが、返されるファセット カウントが正しくないという既知の問題があります。詳細はこちら: Hibernate Searchhttps://forum.hibernate.org/viewtopic.php?f=9&t=1010472を使用して、多値のファセットをアプリケーションに追加します

私はこのソリューションを使用しています: http://sujitpal.blogspot.ie/2007/04/lucene-search-within-search-with.html (記事の下の新しい API に関するコメントを参照)

BitSet ソリューション (少なくともこの例では) は、元の Lucene クエリに基づいてカウントを生成します。これは完全に機能します。でも.....

別の (TTag ではなく、異なる) ファセットが元のクエリに適用されると、複雑な問題が発生します。Bitset ソリューションは、元の Lucene クエリで計算します。代替ファセット (別の FacetSelection) (または TTag ファセット自体) の適用によって縮小された lucene クエリでは計算されません。つまり、カウントの計算は、適用される他の FacetSelection ファセットに関係なく行われます。

そう...

A.ファセットが適用された後、新しい Lucene クエリを取得できますか? これに適用される BitSet ソリューションは正しいでしょう。

B.他に何か提案はありますか?

どうもありがとう.. すべてのコメントを歓迎します。

ジョン

4

1 に答える 1

0

最初の質問については、ファセットを適用しても元のクエリは変更されず、FacetCollectorというカスタムコレクターが使用されます。https: //github.com/hibernate/hibernate-search/blob/master/engine/src/main/java/を参照してください。 org/hibernate/search/query/collector/impl/FacetCollector.java . 内部では、コレクターは Lucene FieldCacheを使用してファセット カウントを実行します。多値ファセットの制限の根本にもあります。FieldCacheは、フィールドごとに複数の値をサポートしていません。

とにかく、ファセット中に追加のクエリは適用されず、元のクエリは変更されません。もちろん、メリットはパフォーマンスです。あなたが指摘しているソリューションもおそらく機能しますが、複数のクエリの実行に依存しています。ただし、ユースケースでは有効な回避策になる場合があります。

于 2013-10-18T11:31:55.050 に答える