Solr条件查询字段(qf)

时间:2014-09-29 21:21:22

标签: search solr lucene edismax solr-query-syntax

是否可以根据特定条件在Solr中定义查询字段?对于例如我有三个字段文本,标题和产品.solr配置定义:

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

我在这里看到的是仅在满足某些条件时将“产品”包括为可搜索字段,例如,如果作者:“Tom”,那么也在Product中搜索。

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

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

任何指针都将受到赞赏。

-Thanks

3 个答案:

答案 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 - 第一个特殊情况
  • qf1 - 要搜索第一个特殊条件的字段列表( fq1
  • fq2 - 第二个特殊情况
  • qf2 - 要搜索第一个特殊条件的字段列表( fq2
  • condQuery - 实际搜索字词/查询

fq1 可能为空以定义基线(在此特定情况下 - 在texttitle中搜索,但不在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发出两次调用来获得结果集。