在Solr中将默认运算符从OR更改为AND(Magento Enterprise)

时间:2013-01-09 00:25:11

标签: magento solr

我正在使用Solr和Magento Enterprise。我正在尝试将默认搜索运算符从OR更改为AND,以使搜索更具体。

我尝试的第一件事就是更改defaultOperator schema.xml中没有达到预期效果的AND(它开始在字段之间使用<solrQueryParser defaultOperator="AND"/> 而非关键字)。

requestHandler

然后我读了LocalParams并尝试将其添加到solrconfig.xml中的几个<requestHandler name="magento_en" class="solr.SearchHandler"> <lst name="defaults"> <str name="q.op">AND</str> 部分(我只是猜测它应该去哪里,我找不到任何有用的文档)。

app/core/core/Enterprise/Search

我也在代码({!q.op=AND})中查了一下,对查询进行了硬编码INFO: [] webapp=/solr path=/select params={start=0&q=articles_title:red+jacket*+articles_summary:red+jacket*+articles_text:red+jacket*+cms_title:red+jacket*+cms_content:red+jacket*&json.nl=map&wt=json&fq=store_id:1+store_id:0&version=1.2&rows=4} hits=7 status=0 QTime=1 09/01/2013 10:46:21 AM org.apache.solr.core.SolrCore execute INFO: [] webapp=/solr path=/select params={spellcheck=true&sort=attr_sort_score_en+desc&spellcheck.extendedResults=true&json.nl=map&wt=json&spellcheck.collate=true&version=1.2&rows=1&fl=id&start=0&q=(Red+jacket)&spellcheck.dictionary=magento_spell_en&q.op=AND&spellcheck.count=2&qt=magento_en&fq=(visibility:3+OR+visibility:4)+AND+store_id:1} hits=645 status=0 QTime=5 09/01/2013 10:46:21 AM org.apache.solr.core.SolrCore execute INFO: [] webapp=/solr path=/select params={facet=on&sort=score+desc&json.nl=map&wt=json&version=1.2&rows=24&fl=id&start=0&facet.query=category_ids:8&facet.query=category_ids:46&facet.query=category_ids:88&facet.query=category_ids:126&facet.query=category_ids:168&facet.query=category_ids:180&facet.query=category_ids:207&facet.query=category_ids:224&facet.query=category_ids:242&facet.query=category_ids:276&q=(Red+jacket)&q.op=AND&facet.field=attr_nav_multi_colourway&qt=magento_en&fq=(visibility:3+OR+visibility:4)+AND+store_id:1} hits=645 status=0 QTime=5 09/01/2013 10:46:22 AM org.apache.solr.core.SolrCore execute INFO: [] webapp=/solr path=/select params={facet=on&sort=attr_sort_score_en+desc&json.nl=map&wt=json&rows=100&version=1.2&start=0&facet.query=category_ids:8&facet.query=category_ids:46&facet.query=category_ids:88&facet.query=category_ids:126&facet.query=category_ids:168&facet.query=category_ids:180&facet.query=category_ids:207&facet.query=category_ids:224&facet.query=category_ids:242&facet.query=category_ids:276&q=(Red+jacket)&q.op=AND&facet.field=attr_nav_multi_colourway&qt=magento_en&fq=(visibility:3+OR+visibility:4)+AND+store_id:1} hits=645 status=0 QTime=6 09/01/2013 10:46:22 AM org.apache.solr.core.SolrCore execute INFO: [] webapp=/solr path=/select params={facet=on&sort=attr_sort_score_en+desc&json.nl=map&wt=json&rows=100&version=1.2&start=0&facet.query=category_ids:8&facet.query=category_ids:46&facet.query=category_ids:88&facet.query=category_ids:126&facet.query=category_ids:168&facet.query=category_ids:180&facet.query=category_ids:207&facet.query=category_ids:224&facet.query=category_ids:242&facet.query=category_ids:276&q=(Red+jacket)&q.op=AND&facet.field=attr_nav_multi_colourway&qt=magento_en&fq=(visibility:3+OR+visibility:4)+AND+store_id:1} hits=645 status=0 QTime=3 ,但仍无法使其生效。

我想这是一个简单的配置更改,任何人都可以指出我正确的方向吗?

修改:为了澄清,搜索“红色外套”(不含引号)应返回“红色夹克”的结果。我只对实际上是红色夹克的产品感兴趣,而不是红色的鞋子和/或蓝色夹克。手动搜索“红色夹克”会返回我所追求的结果。

目前,搜索会执行以下查询:

{{1}}

6 个答案:

答案 0 :(得分:13)

感谢Macilias在dismax parser plugin上的链接,我找到了使用solrconfig.xml中的设置完成此操作的方法。在这个文件中有一堆不同语言的requestHandler节点。我修改了英文版,因为我们的商店是英文版。默认情况下,xml看起来像这样:

<requestHandler name="magento_en" class="solr.SearchHandler">
    <lst name="defaults">
        <str name="qf">fulltext_1_en^1.0 fulltext_2_en^2.0 fulltext_3_en^3.0 fulltext_4_en^4.0 fulltext_5_en^5.0</str>
        <str name="pf">fulltext_1_en^1.0 fulltext_2_en^2.0 fulltext_3_en^3.0 fulltext_4_en^4.0 fulltext_5_en^5.0</str>
        <int name="ps">1</int>
        <str name="mm">1</str>
        <str name="defType">dismax</str>
        <str name="echoParams">explicit</str>
        <str name="spellcheck.onlyMorePopular">false</str>
        <str name="spellcheck.extendedResults">false</str>
        <str name="spellcheck.count">1</str>
    </lst>
    <arr name="last-components">
        <str>spellcheck</str>
    </arr>
</requestHandler>

这里的重要参数是“mm”,代表Minimum 'Should' Match。 dismax解析器使用它而不是默认运算符来确定应该如何处理多个搜索项。值为1表示查询中只有一个术语必须匹配(与OR相同的行为)。值100%表示所有术语必须匹配(与AND相同的行为)。也可以使用更复杂的值。请点击上面的链接获取更多信息。更改solrconfig.xml文件中的设置后,您需要重新启动Solr服务器才能生效。

此视频也是一款优秀的Magento Solr资源:http://www.youtube.com/watch?v=07uIJSXdqpU 他们谈论24分钟左右的最小比赛。

答案 1 :(得分:4)

我最终使用q.op将操作符更改为AND而不是OR。例如:

 ?q=text:small cars&q.op=AND

答案 2 :(得分:2)

尝试以下(未经测试):

q={!q.op=AND df=articles_title}red jacket&fq=articles_summary:(red AND jacket)&fq=articles_text:(red AND jacket)

,其余字段的使用方式与fq参数类似。

以上将返回所有提到的字段包含术语红色和夹克的所有记录。但是,如果您需要返回至少一个字段包含红色AND夹克的记录,那么我建议您使用copyfield将所有这些字段映射到单个字段,然后搜索copyfield类型。

答案 3 :(得分:0)

My question is not so much about the syntax but where to configure this so it applies to all searches.

要回答你的问题,我很确定我们需要在schema.xml中为solrQueryParser指定默认运算符,而不是在solrconfig.xml中。正如你所提到的,它是,

< solrQueryParser defaultOperator="AND"/>

您未获得预期结果的原因可能是由于以下原因:

如果您的搜索网址类似,

q=articles_summary:red+jacket

然后会发生什么,“red”会根据字段“articles_summary”进行搜索,但“jacket”会针对您的进行搜索默认搜索字段(比如“文字”),如果我是对的,将是包含所有可搜索字段副本的复制字段。因此,您将在“articles_summary”和“text”中的“jacket”中获得“red”的匹配。

为了得到您的期望,我建议您在将默认操作设置为AND之后使用类似URL的内容:

q=articles_summary:red+articles_summary:jacket

如果您要搜索多个字段,则可能需要执行以下操作:

q=articles_summary:red+articles_summary:jacket+articles_title:red+articles_title:jacket

答案 4 :(得分:0)

要回答我自己的问题,我最终会覆盖Enterprise_Search_Model_Adapter_HttpStream模型,将AND注入搜索查询。我添加了prepareSearchConditions()的{​​{1}}方法:

Enterprise_Search_Model_Adapter_Solr_Abstract

它显然与其他运营商不太相配,但在我的情况下它足够好™(至少目前为止)。我仍然希望找到更好的解决方案。

答案 5 :(得分:0)

在solr中你应该使用dismax(或edismax)解析器插件。在这里,您可以将最小值设置为100%。 you can find more information here