2

私のプロジェクトでは、solrを使用して、BooksやPersonsなど、さまざまな種類のドキュメントにインデックスを付けます。いくつかの一般的なフィールド(名前など)とタイプ固有のフィールド(カテゴリや人々が属するグループなど)を使用します。 。

本と人物の両方を検索できるクエリを実行し、ドキュメントタイプごとにいくつかのフィルターを適用します。何かのようなもの:

  • 名前やコンテンツに「Jean」が含まれるすべての本と人物を検索する
  • ただし、「フィクション」と「ファンタジー」のカテゴリの本のみ
  • そして「パンゴリン」グループの人だけ
  • スコアでソートされたすべて

これを行う非常に簡単な方法は次のとおりです。

q = name:jean content:jean
&
fq= 
    (type:book AND category:(fiction fantasy)) 
    OR 
    (type:person AND group:pangolin)

しかし、残念ながら、fqキャッシュされているように、私は次のように、よりシンプルで再利用可能fqなものを好みます。

  • fq=type:book
  • fq=type:person
  • fq=category(fiction fantasy)
  • fq=group:pangolin

多くのクエリをマージまたは結合するようにsolrに指示する方法はありますか?fq一緒に「グループ化」のようなもの。

でネストされたクエリについて少し読みました_query_が、ドキュメントがほとんどないため、探しているソリューションではないと思います。

4

3 に答える 3

3

Geert-Janが彼の回答でそれを述べたように、その間で行う可能性ORfqsolrを求める機能ですが、今のところほとんどサポートされていません:https ://issues.apache.org/jira/browse/SOLR-1223

だから私は簡単な方法で私がやりたいことをシミュレートすることができました:

  • ドキュメントタイプが持つことができるフィールドごとに、毎回値を定義する必要があります(したがって、私の例でBooksにカテゴリを含めることができない場合でも、インデックス時に次のようなものを定義する必要があります。category=noCategoryCode
  • 複数のタイプのクエリでこのフィールドの1つにフィルターを使用すると、フィルターに存在しない条件が追加されるため、次のようにfq=category:fictionなります。fq=category:fiction (*:* AND -category:*)

このようにして、他のすべてのタイプ(Personなど)はこのフィルターを通過し、フィルターは非常にアトミックで頻繁に使用されるため、キャッシュは引き続き役立ちます。

したがって、私の完全な例は次のようになります。

q = name:jean content:jean
&
fq= type:(book person)
&
fq= category:(fiction fantasy) (*:* AND -category:*)
&
fq= group:(pangolin) (*:* AND -group:*)

それでも、SOLR-1223にパッチが適用されるのを待つことはできません:)

于 2011-10-07T07:13:01.137 に答える
0

複数のフィルタークエリを同時に適用できます

q=name:jean content:jean&fq=type:book&fq=type:person&fq=category(fiction fantasy)&fq=group:pangolin

于 2011-10-05T17:48:14.950 に答える
0

おそらく私はあなたの問題を理解していませんが、クエリとフィルターの唯一の違いは、フィルターがキャッシュされていることです。キャッシングを気にしない場合は、クエリを変更するだけです。

real query +((type:book category:fiction) (type:person group:pangolin))

于 2011-10-06T18:19:26.407 に答える