5

次のようなインデックスを想像してみてください。

id   partno      name          description
1    1000.001    Apple iPod    iPod by Apple
2    1000.123    Apple iPhone  The iPhone

ユーザーが「Apple」を検索すると、両方のドキュメントが返されます。ここで、検索を1つ以上のフィールドに限定して、検索結果を絞り込むことができるようにします。これらのフィールドには、「Apple」という用語を含むドキュメントが含まれています。

したがって、理想的には、ユーザーは最初のクエリの後にUIのフィルターセクションに次のようなものが表示されます。


フィールド名でフィルタリング(2)
説明(1)

ユーザーがフィールド「description」にフィルターを適用すると、フィールド「description」内に「Apple」という用語が含まれているドキュメントのみが返されます。したがって、その2番目の要求の結果セットはiPodドキュメントのみになります。そのためには、次のようなクエリを使用します?q=Apple&qf=descriptionExtended DisMax Query Parserを使用しています) 。

Solrでそれをどのように達成できますか?

私はすでにコンポーネントのファセット、グループ化、および強調表示を試しましたが、これに対する適切な解決策には実際には到達しませんでした。


[更新]
もう一度明確にするために:ここでの主な問題は、[フィールドでフィルター]セクションを表示するために必要な情報を取得することです。これには、フィールドの名前とフィールドごとのヒット数が含まれます。これらのフィルターの1つを適用した2番目のリクエストの送信は、すでに機能しています。

4

5 に答える 5

1

これは、2つの異なる検索要求/クエリで実現できます。

名前:アップル->2ヒット

説明:アップル->1ヒット

編集:

SearchComponentまた、バックグラウンドで複数のクエリを実行する独自のクエリを実装し、それをSearchHandler処理チェーンに配置して、フロントエンドで1つのクエリのみが必要になるようにすることもできます。

于 2012-12-19T09:36:50.890 に答える
1

用語を毎回同じフィールドで検索する場合は、「単一クエリ」の要件に違反しない2つのオプションがあります。

1)copyField:インデックス時に、一緒に一致する必要があるすべてのフィールドをグループ化します。コピーフィールドが1つしかない場合、問題は発生しません。複数のコピーフィールドが必要な場合は、同じ場所にいます。

2)最後に「fq」パラメータを動的に追加するたびにクエリをフィルタリングできます

http://<your_url_and_stuff>/?q=Apple&fq=name:Apple ...

これは、常に同じ2つのフィールドを検索する場合(またはクエリを実行する前に設定できる場合)に機能します。それ以外の場合は、少なくとも2番目のクエリが常に必要になります。

「2つの選択肢があります」と言ったのですが、実際には3つあります(そして私は答えを急いでいます)ので、これが3番目です:

3)次のように彼らによって記述されたdismaxプラグイン

The DisMaxQParserPlugin is designed to process simple user entered phrases 
(without heavy syntax) and search for the individual words across several fields 
using different weighting (boosts) based on the significance of each field.

ですから、もしあなたがそれを使うことができるなら、あなたはそれを見て、qfパラメータから始めたいと思うかもしれません(それはオプション番号2が望んでいたことですが、私はfqを支持してそれを変更しました...尋ねないでください私の理由...)

于 2012-12-19T11:55:36.503 に答える
1

Solrは単純にこれを行いません。どうしても必要な場合は、複数リクエストソリューションを試してベンチマークを行います。solrは、人々がその前に置くものよりもはるかに高速である傾向があるため、いくつかのリクエストはそれほど大きな問題ではない可能性があります。

于 2012-12-19T11:56:10.137 に答える
0

SolrFacetingはあなたの問題を解決するはずです。を見てください。

于 2012-12-19T09:54:52.733 に答える
0

これはSolrファセットを使用して実現できますが、適切ではありません。たとえば、次のクエリを発行できます。

/select?q=*:*&rows=0&facet=true&facet.query=title:donkey&facet.query=text:donkey&wt=json

およびフィールドdonkeyに含まれるドキュメントの数を検索します。私はこの応答を得るかもしれません:titletext

{
 "responseHeader":{"status":0,"QTime":1,"params":{"facet":"true","facet.query":["title:donkey","text:donkey"],"q":"*:*","wt":"json","rows":"0"}},
 "response":{"numFound":3365840,"start":0,"docs":[]},
 "facet_counts":{
  "facet_queries":{
   "title:donkey":127,
   "text:donkey":4108
  },
  "facet_fields":{},
  "facet_dates":{},
  "facet_ranges":{}
 }
}

フィールド分離クエリ用にドキュメントも戻したいので、次のように機能します。

/select?q=donkey&defType=edismax&qf=text+titlle&rows=10&facet=true&facet.query=title:donkey&facet.query=text:donkey&wt=json
于 2013-10-10T02:59:50.940 に答える