我正在使用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}}
答案 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