是否可以根据特定条件在Solr中定义查询字段?对于例如我有三个字段文本,标题和产品.solr配置定义:
<str name="qf">text^0.5 title^10.0 Product</str>
我在这里看到的是仅在满足某些条件时将“产品”包括为可搜索字段,例如,如果作者:“Tom”,那么也在Product中搜索。
使用edismax在查询时间有没有办法做到这一点?
替代方案是在索引时间内将产品信息添加到文档的文本或标题(其中author = Tom),以便可以搜索。但是,如果可能的话,我试图避免这种情况。
任何指针都将受到赞赏。
-Thanks
答案 0 :(得分:5)
为了根据不同的条件搜索不同的字段,首先需要搜索特定条件,因此它与发出多个查询大致相同。
也就是说,如果需要将其作为一次性查询(例如,用于开箱即用的排序/分组/其他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 可能为空以定义基线(在此特定情况下 - 在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>
即使它有效,我建议考虑它对查询时间的影响(因为每个条件都有一个单独的内部搜索查询),并衡量它对你的具体情况的影响。
答案 1 :(得分:0)
我没有自己尝试,但看起来这可以通过使用http://wiki.apache.org/solr/FunctionQuery#Boolean_Functions来实现
答案 2 :(得分:0)
Shamik,
我认为在Solr中有一种方法可以轻松完成。需要考虑的一件事是加班管理这些规则,这对于大型系统来说将是一场噩梦。
如果你真的想做这样的事情,也许你可以向Solr发出两次调用来获得结果集。