異なる条件で異なるフィールドを検索するには、まずその特定の条件を検索する必要があるため、複数のクエリを発行することとほぼ同じです。
つまり、1 回限りのクエリとして実行する必要がある場合 (たとえば、すぐに使える並べ替え/グループ化/その他の solr 機能など)、ネストされたクエリを使用できます。
2 つの異なる条件を定義する場合 (元の質問のように、OR 句を追加して簡単に拡張できます)、q
パラメーターは次の値を受け取ることができます。
_query_:"{!edismax fq=$fq1 qf=$qf1 v=$condQuery}"
OR
_query_:"{!edismax fq=$fq2 qf=$qf2 v=$condQuery}"
クエリはParameter Dereferencingを使用するため、パラメーターを solr に渡す前に特殊文字を手動でエスケープする必要はありません。
- fq1 - 最初の特別な条件
- qf1 - 最初の特別な条件を検索するフィールドのリスト ( fq1 )
- fq2 - 2 番目の特別な条件
- qf2 - 最初の特別な条件を検索するフィールドのリスト ( fq2 )
- condQuery - 実際の検索語/クエリ
fq1は、ベースラインを定義するために空にすることができます (この特定のケースでは、 と で検索しますが、text
では検索しtitle
ませんproduct
)。
生のパラメーター自体は次のようになります。
fq1=&qf1=text^0.5 title^10.0&fq2=author:"Tom"&qf2=text^0.5 title^10.0 Product&condQuery=5
最終クエリは次のようになります。
http://localhost:8983/solr/collection1/select?q=_query_%3A%22%7B!edismax+fq%3D%24fq1+qf%3D%24qf1+v%3D%24condQuery%7D%22+OR+_query_%3A%22%7B!edismax+fq%3D%24fq2+qf%3D%24qf2+v%3D%24condQuery%7D%22&fl=*%2Cscore&wt=xml&indent=true&fq1=&qf1=text^0.5%20title^10.0&fq2=author:%22Tom%22&qf2=text^0.5%20title^10.0%20Product&condQuery=5
.. または solr 応答で solr によって返される同じクエリ (構造化された方法で表示するためだけに提供されます):
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
<lst name="params">
<str name="q">_query_:"{!edismax fq=$fq1 qf=$qf1 v=$condQuery}" OR _query_:"{!edismax fq=$fq2 qf=$qf2 v=$condQuery}"</str>
<str name="condQuery">5</str>
<str name="indent">true</str>
<str name="fl">*,score</str>
<str name="fq1"/>
<str name="qf1">text^0.5 title^10.0</str>
<str name="fq2">author:"Tom"</str>
<str name="qf2">text^0.5 title^10.0 Product</str>
<str name="wt">xml</str>
</lst>
</lst>
<result name="response" numFound="..." start="..." maxScore="...">
...
</result>
</response>
機能しますが、クエリ時間に与える影響を考慮し (各条件には個別の内部検索クエリがあるため)、特定のケースにどのように影響するかを測定することをお勧めします。