2014-09-29 167 views
0

是否可以根据特定条件在Solr中定义查询字段?对于例如我有三个字段的文字,标题和产物。Solr的配置定义:Solr条件查询字段(qf)

<str name="qf">text^0.5 title^10.0 Product</str> 

我正在寻找在这里是有“产品”,因为只有当某些条件得到满足,对于例如搜索领域如果作者:“汤姆”,然后搜索产品。

有没有办法在查询时使用edismax做到这一点?

我使用的替代方法是在索引期间将产品信息添加到文档或文档的标题(其中author = Tom),以便可搜索。但是,如果可能的话,我试图避免这种情况。

任何指针将不胜感激。

-Thanks

回答

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 - 第一特殊条件
  • QF1 - 字段列表来搜索在第一个特殊条件(FQ1
  • FQ2 - 第二个特殊条件
  • QF2 - 用于搜索第一特殊情况的字段列表(fq2
  • condQuery - 实际的搜索项/查询

FQ1可能是为了定义一个基线空(在此特定情况下 - 在producttexttitle搜索,但不是)。

原始参数本身看起来方式如下:

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> 

即使它起作用,我建议考虑它对查询时间的影响(因为每个条件都会有一个单独的内部搜索查询)并测量它如何影响您的特定情况。

+0

谢谢,我一直在想如何实现这个! – Vince 2015-09-22 21:17:59

0

Shamik,

我不认为是可以实现的是有办法在Solr中做到这一点很简单。有一点需要考虑的是加班时间管理这些规则,这对大型系统来说是一场噩梦。

如果你真的想这样做,也许你可以发出两个调用Solr来获得结果集。