为了根据不同的条件在不同的字段中进行搜索,需要先搜索到那个特定的条件,因此它或多或少与发出多个查询相同。
也就是说,如果需要将其作为一次性查询(例如,用于开箱即用的排序/分组/其他 solr 功能),可以使用嵌套查询。
为了定义两个不同的条件(如在原始问题中,但可以使用更多 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 - 第二个特殊条件
- qf2 - 搜索第一个特殊条件 ( fq2 )的字段列表
- condQuery - 实际的搜索词/查询
fq1可以为空以定义基线(在这种特殊情况下 - 在text
and中搜索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>
即使它有效,我建议考虑它对查询时间的影响(因为每个条件都有一个单独的内部搜索查询)并衡量它如何影响您的具体案例。