Подтвердить что ты не робот

Изменение оператора по умолчанию от 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 
4b9b3361

Ответ 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