为了根据不同的条件在不同的领域进行搜索,需要首先搜索特定的条件,因此它与发出多个查询差不多。
这就是说,如果有必要做它作为一个一次性的查询(例如,用于外的现成排序/分组/其他solr的特征),则nested queries可以使用。
定义两个不同的条件(如在原来的问题,但它可以很容易地与更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可能是为了定义一个基线空(在此特定情况下 - 在product
在text
和title
搜索,但不是)。
原始参数本身看起来方式如下:
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>
即使它起作用,我建议考虑它对查询时间的影响(因为每个条件都会有一个单独的内部搜索查询)并测量它如何影响您的特定情况。
谢谢,我一直在想如何实现这个! – Vince 2015-09-22 21:17:59