问题描述
我在 Magento Enterprise 中使用 Solr.我正在尝试将默认搜索运算符从 OR
更改为 AND
以在默认情况下使搜索更加具体.
I'm using Solr with Magento Enterprise. I'm trying to change the default search operator from OR
to AND
to make searches more specific by default.
我尝试的第一件事是更改 schema.xml
中的 defaultOperator
没有达到预期的效果(它开始使用 AND
字段之间,而不是关键字之间).
The first thing I tried was to to change defaultOperator
in schema.xml
which did not have the desired effect (it started using AND
between fields, not keywords).
<solrQueryParser defaultOperator="AND"/>
然后我阅读了 LocalParams 并尝试将其添加到几个 requestHandler
solrconfig.xml
中的部分(我只是在猜测它应该去哪里,我找不到任何有用的文档).
I then read about LocalParams and tried adding that to several requestHandler
sections in solrconfig.xml
(I'm just guessing where it's supposed to go, I can't find any helpful documentation).
<requestHandler name="magento_en" class="solr.SearchHandler">
<lst name="defaults">
<str name="q.op">AND</str>
我还在代码 (app/core/core/Enterprise/Search
) 中进行了检查,将 {!q.op=AND}
硬编码到查询中但仍然无法让它工作.
I also poked around in the code (app/core/core/Enterprise/Search
), hard-coded {!q.op=AND}
to the queries but still couldn't get it to work.
我想这是一个简单的配置更改,有人能指出我正确的方向吗?
I imagine it's a simple configuration change, can anyone point me in the right direction?
澄清一下,搜索红色夹克"(不带引号)应该返回红色和夹克"的结果.我只对实际上是红色夹克的产品感兴趣,而不是红色鞋子和/或蓝色夹克.手动搜索红色和夹克"会返回我想要的结果.
To clarify, a search for "red jacket" (without quotes) should return results for "red AND jacket". I'm only interested in products that are actually red jackets, not red shoes and/or blue jackets. A manual search for "red AND jacket" returns the results that I'm after.
当前搜索执行以下查询:
Currently a search performs these queries:
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
推荐答案
为了回答我自己的问题,我最终覆盖了 Enterprise_Search_Model_Adapter_HttpStream
模型,将 AND
注入到搜索查询.我添加了 Enterprise_Search_Model_Adapter_Solr_Abstract
中的 prepareSearchConditions()
方法:
To answer my own question, I ended up overriding the Enterprise_Search_Model_Adapter_HttpStream
model to inject AND
s into the search query. I added the prepareSearchConditions()
method from 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);
}
}
它显然与其他运营商不兼容,但就我而言,它足够好™(至少现在是这样).不过,我仍然希望找到更好的解决方案.
It doesn't play nice with other operators obviously but in my case it's good enough™ (at least for now). I'm still hoping to find a better solution though.
这篇关于在 Solr (Magento Enterprise) 中将默认运算符从 OR 更改为 AND的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!