web-dev-qa-db-ja.com

Solr(Magento Enterprise)でデフォルトの演算子をORからANDに変更

MagentoEnterpriseでSolrを使用しています。デフォルトの検索演算子をORからANDに変更して、デフォルトで検索をより具体的にしようとしています。

私が最初に試したのは、schema.xmldefaultOperatorを変更することでしたが、目的の効果はありませんでした(キーワードではなく、フィールド間でANDを使用し始めました)。

<solrQueryParser defaultOperator="AND"/>

次に、 LocalParams について読み、それをsolrconfig.xmlのいくつかのrequestHandlerセクションに追加しようとしました(どこに行くべきかを推測しているだけで、役立つものは見つかりませんドキュメンテーション)。

<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 
13
Elbert Alias

私自身の質問に答えるために、私は_Enterprise_Search_Model_Adapter_HttpStream_モデルをオーバーライドして、検索クエリにANDsを挿入することになりました。 _Enterprise_Search_Model_Adapter_Solr_Abstract_からprepareSearchConditions()メソッドを追加しました。

_<?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);
    }
}
_

明らかに他の演算子とはうまく機能しませんが、私の場合は十分に良い™(少なくとも今のところ)です。私はまだより良い解決策を見つけることを望んでいます。

0
Elbert Alias

dismaxパーサープラグイン の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 を表します。 dismaxパーサーは、デフォルトの演算子の代わりにこれを使用して、複数の検索語を処理する方法を決定します。値1は、クエリの1つの用語のみが一致する必要があることを意味します(ORと同じ動作)。 100%の値は、すべての用語が一致する必要があることを意味します(ANDと同じ動作)。より複雑な値も使用できます。詳細については、上記のリンクをたどってください。 solrconfig.xmlファイルの設定を変更した後、有効にする前にSolrサーバーを再起動する必要があります。

このビデオは、Magento Solrの優れたリソースでもあります。 http://www.youtube.com/watch?v=07uIJSXdqp 彼らは、24分前後の最小一致について話します。

13
Zeke Farwell

結局、演算子をORではなくANDに変更するq.opを使用することになりました。例えば:

 ?q=text:small cars&q.op=AND
4
someuser

次の(テストされていない)を試してください。

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

残りのフィールドは、fqパラメーターを使用して同様の方法で使用されます。

上記は、言及されたすべてのフィールドに用語redとjacketが含まれているすべてのレコードを返します。ただし、少なくとも1つのフィールドに赤とジャケットが含まれているレコードを返す必要がある場合は、コピーフィールドを使用してこれらすべてのフィールドを1つのフィールドにマップしてから、コピーフィールドタイプを検索することをお勧めします。

2
Max

Solrでは、dismax(またはedismax)パーサープラグインを使用する必要があります。ここで、最小値を100%に一致するように設定できます。 詳細はこちらをご覧ください

0
Macilias
My question is not so much about the syntax but where to configure this so it applies to all searches.

あなたの質問に答えるには、solrconfig.xmlではなくschema.xmlでsolrQueryParserのデフォルト演算子を指定する必要があると確信しています。あなたが言ったように、それはとして与えられます、

< solrQueryParser defaultOperator="AND"/>

期待した結果が得られなかった理由は、次の理由による可能性があります。

検索URLが次のような場合、

q=articles_summary:red+jacket

次に、"red"フィールドに対して検索されます"articles_summary"しかし、"jacket"デフォルトの検索field(「テキスト」と言います)これは、私が正しければコピーフィールドすべての検索可能なフィールドのコピーを含みます。したがって、「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
0
Mavellin