0

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

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

我在这里寻找的是仅在满足某些条件时才将“产品”作为可搜索字段包含在内,例如,如果作者:“汤姆”,那么也可以在产品中搜索。

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

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

任何指针将不胜感激。

-谢谢

4

3 回答 3

5

为了根据不同的条件在不同的字段中进行搜索,需要先搜索到那个特定的条件,因此它或多或少与发出多个查询相同。


也就是说,如果需要将其作为一次性查询(例如,用于开箱即用的排序/分组/其他 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可以空以定义基线(在这种特殊情况下 - 在textand中搜索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>

即使它有效,我建议考虑它对查询时间的影响(因为每个条件都有一个单独的内部搜索查询)并衡量它如何影响您的具体案例。

于 2014-09-30T20:34:50.330 回答
0

我自己没有尝试过,但看起来这可以通过使用http://wiki.apache.org/solr/FunctionQuery#Boolean_Functions来实现

于 2014-09-30T06:59:48.413 回答
0

沙米克,

我认为在 Solr 中没有一种简单的方法可以做到这一点。需要考虑的一件事是超时管理这些规则,这对于大型系统来说将是一场噩梦。

如果您真的想做这样的事情,也许您可​​以向 Solr 发出两次调用以获取结果集。

于 2014-09-30T19:35:54.917 回答