MagentoEnterpriseでSolrを使用しています。デフォルトの検索演算子をOR
からAND
に変更して、デフォルトで検索をより具体的にしようとしています。
私が最初に試したのは、schema.xml
のdefaultOperator
を変更することでしたが、目的の効果はありませんでした(キーワードではなく、フィールド間で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
私自身の質問に答えるために、私は_Enterprise_Search_Model_Adapter_HttpStream
_モデルをオーバーライドして、検索クエリにAND
sを挿入することになりました。 _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);
}
}
_
明らかに他の演算子とはうまく機能しませんが、私の場合は十分に良い™(少なくとも今のところ)です。私はまだより良い解決策を見つけることを望んでいます。
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分前後の最小一致について話します。
結局、演算子をORではなくANDに変更するq.opを使用することになりました。例えば:
?q=text:small cars&q.op=AND
次の(テストされていない)を試してください。
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つのフィールドにマップしてから、コピーフィールドタイプを検索することをお勧めします。
Solrでは、dismax(またはedismax)パーサープラグインを使用する必要があります。ここで、最小値を100%に一致するように設定できます。 詳細はこちらをご覧ください
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