Sha*_*mik 0 lucene search solr edismax solr-query-syntax
是否可以根据特定条件在Solr中定义查询字段?例如,我有三个字段文本,标题和产品.solr配置定义:
<str name="qf">text^0.5 title^10.0 Product</str>
Run Code Online (Sandbox Code Playgroud)
我在这里看到的是仅在满足某些条件时将"产品"包括为可搜索字段,例如,如果作者:"Tom",则在Product中搜索.
有没有办法在使用edismax的查询时间内执行此操作?
替代方案是在索引时间内将产品信息添加到文档的文本或标题(其中author = Tom),以便可以搜索.但是,如果可能的话,我试图避免这种情况.
任何指针将不胜感激.
-谢谢
为了基于不同的条件在不同的字段中进行搜索,需要首先搜索该特定条件,因此它与发出多个查询或多或少相同.
也就是说,如果需要将其作为一次性查询(例如,用于开箱即用的排序/分组/其他solr功能),则可以使用嵌套查询.
为了定义两个不同的条件(如在原始问题中,但可以使用更多OR子句轻松扩展),该q参数可以接收以下值:
_query_:"{!edismax fq=$fq1 qf=$qf1 v=$condQuery}"
OR
_query_:"{!edismax fq=$fq2 qf=$qf2 v=$condQuery}"
Run Code Online (Sandbox Code Playgroud)
该查询使用参数解除引用,因此在将参数传递给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
Run Code Online (Sandbox Code Playgroud)
最终的查询将是这样的:
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
Run Code Online (Sandbox Code Playgroud)
..或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>
Run Code Online (Sandbox Code Playgroud)
即使它有效,我建议考虑它对查询时间的影响(因为每个条件都有一个单独的内部搜索查询)并测量它对你的具体情况的影响.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3999 次  |  
        
|   最近记录:  |