14

我正在将 Solr 与 Magento Enterprise 一起使用。我正在尝试将默认搜索运算符从更改为默认情况下OR使AND搜索更具体。

我尝试的第一件事是更改defaultOperator其中schema.xml没有达到预期效果(它开始AND在字段之间使用,而不是关键字)。

<solrQueryParser defaultOperator="AND"/>

然后我阅读了LocalParams并尝试将其添加到中的几个requestHandler部分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}

我想这是一个简单的配置更改,有人能指出我正确的方向吗?

编辑:为了澄清,搜索“红色夹克”(不带引号)应该返回“红色和夹克”的结果。我只对实际上是红色夹克的产品感兴趣,而不是红色鞋子和/或蓝色夹克。手动搜索“红色 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 
4

6 回答 6

13

感谢 Macilias 在dismax 解析器插件上的链接,我找到了一种通过 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”,它代表最小“应该”匹配。dismax 解析器使用它而不是默认运算符来确定应如何处理多个搜索词。值 1 表示查询中只有一个术语必须匹配(与 OR 的行为相同)。值 100% 表示所有术语必须匹配(与 AND 行为相同)。也可以使用更复杂的值。按照上面的链接了解更多信息。更改 solrconfig.xml 文件中的设置后,您需要重新启动 Solr 服务器才能生效。

该视频也是一个很好的 Magento Solr 资源: http ://www.youtube.com/watch?v=07uIJSXdqpU 他们在 24 分钟左右谈论最小匹配。

于 2013-09-02T21:05:28.107 回答
4

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

 ?q=text:small cars&q.op=AND
于 2015-10-23T00:53:52.033 回答
2

尝试以下(未经测试):

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

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

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

于 2013-01-09T01:01:47.663 回答
0

为了回答我自己的问题,我最终重写了Enterprise_Search_Model_Adapter_HttpStream模型以将ANDs 注入到搜索查询中。我prepareSearchConditions()从以下位置添加了方法Enterprise_Search_Model_Adapter_Solr_Abstract

<?php

class Foo_Search_Model_Adapter_HttpStream extends Enterprise_Search_Model_Adapter_HttpStream
{
    protected function prepareSearchConditions($query)
    {
        $query = str_replace(' ', ' AND ', str_replace(' AND ', ' ', $query));

        return parent::prepareSearchConditions($query);
    }
}

显然,它与其他运营商的合作并不好,但就我而言,它已经足够了™ (至少目前如此)。不过,我仍然希望找到更好的解决方案。

于 2013-01-11T05:21:12.423 回答
0
My question is not so much about the syntax but where to configure this so it applies to all searches.

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

< solrQueryParser defaultOperator="AND"/>

您没有得到预期结果的原因可能是因为以下原因:

如果您的搜索网址类似于,

q=articles_summary:red+jacket

然后发生的事情是,“red”是针对字段“articles_summary”搜索的,但“jacket”是针对您的默认搜索字段(比如“text”)进行搜索的,如果我是对的,它将是一个包含所有可搜索字段副本的副本字段。因此,您将在“articles_summary”中匹配“red”,在“text”中匹配“jacket”。

为了达到您的期望,我建议您在将默认操作设置为 AND 之后使用类似以下 URL 的内容,就像您已经做的那样:

q=articles_summary:red+articles_summary:jacket

如果您有多个要搜索的字段,则可能必须这样做:

q=articles_summary:red+articles_summary:jacket+articles_title:red+articles_title:jacket
于 2013-01-09T04:15:54.153 回答
0

在 solr 中,您应该使用 dismax(或 edismax)解析器插件。在这里,您可以将最小值应匹配为 100%。您可以在这里找到更多信息

于 2013-06-18T14:01:35.253 回答