Изменение оператора по умолчанию от OR до AND в Solr (Magento Enterprise)
Я использую 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}
для запросов, но все еще не мог заставить его работать.
Я представляю себе простое изменение конфигурации, может ли кто-нибудь указать мне в правильном направлении?
Изменить: Чтобы уточнить, поиск "красной куртки" (без кавычек) должен возвращать результаты для "red AND jacket". Меня интересуют только продукты, которые на самом деле красные куртки, а не красные туфли и/или синие куртки. Ручной поиск "red AND jacket" возвращает результаты, которые я после.
В настоящее время поиск выполняет следующие запросы:
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
Чтобы ответить на мой вопрос, я закончил переопределять модель Enterprise_Search_Model_Adapter_HttpStream
, чтобы ввести AND
в поисковый запрос. Я добавил метод 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);
}
}
Он неплохо играет с другими операторами, но в моем случае это достаточно хорошо ™ (по крайней мере пока). Я все еще надеюсь найти лучшее решение, хотя.
Ответ 2
Благодаря ссылке Macilias в плагине плагина разборки я нашел способ выполнить это с настройками в файле 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. Анализатор smax использует это вместо оператора по умолчанию, чтобы определить, как нужно обрабатывать несколько поисковых терминов. Значение 1 означает, что только один термин из запроса должен совпадать (такое же поведение, как и OR). Значение 100% означает, что все условия должны совпадать (такое же поведение, как AND). Также могут использоваться более сложные значения. Для получения дополнительной информации перейдите по ссылке выше. После изменения настроек в файле solrconfig.xml вам необходимо перезапустить сервер Solr, прежде чем они вступят в силу.
Это видео также является хорошим ресурсом Magento Solr: http://www.youtube.com/watch?v=07uIJSXdqpU
Они говорят о минимальном совпадении в течение 24-минутной отметки.
Ответ 3
попробуйте следующее (непроверенное): -
q=(!q.op=AND df=articles_title}red jacket&fq=articles_summary:(red AND jacket)&fq=articles_text:(red AND jacket)
а остальные поля используются аналогично параметру fq.
Вышеупомянутые возвращают все те записи, где все упомянутые поля содержат термин "красный" и "куртка". Однако, если вам требуется вернуть запись, в которой по крайней мере одно поле содержит красный и куртку, я предлагаю вам использовать поле для копирования, чтобы отобразить все эти поля в одно поле, а затем выполнить поиск по типу экземпляра.
Ответ 4
В итоге я использовал q.op, который заменил оператор на AND вместо OR. Например:
?q=text:small cars&q.op=AND
Ответ 5
My question is not so much about the syntax but where to configure this so it applies to all searches.
Чтобы ответить на ваш вопрос, я совершенно уверен, что нам нужно указать оператор по умолчанию для solrQueryParser в schema.xml, а не в файле solrconfig.xml. Как вы упомянули, оно дается как:
< solrQueryParser defaultOperator="AND"/>
Причина, по которой вы не ожидали результатов, может быть вызвана следующей причиной:
Если ваш URL-адрес поиска похож,
q=articles_summary:red+jacket
Затем происходит поиск "красный" с полем "articles_summary" , но "куртка" выполняется с помощью поле поиска по умолчанию (скажем, "текст" ), который, если я прав, будет скопировать поле, содержащее копию всех полей для поиска. Следовательно, вы получите соответствие для "красного" в "articles_summary" и "jacket" в "тексте".
Чтобы получить то, что вы ожидаете, я предлагаю вам использовать что-то вроде следующего URL-адреса после установки операции по умолчанию на AND, как вы уже делали:
q=articles_summary:red+articles_summary:jacket
Если у вас есть несколько полей для поиска, вам может потребоваться сделать следующее:
q=articles_summary:red+articles_summary:jacket+articles_title:red+articles_title:jacket
Ответ 6
В solr вы должны использовать плагин paraser (или edismax). Здесь вы можете установить минимальное значение, которое должно соответствовать 100%. вы можете найти здесь дополнительную информацию