6

Solrを使用して製品を検索するオンラインストアがあります。基本的なセットアップは問題なく動作しますが、現在、いくつかの機能が不足しています。Amazon などのオンライン ショップを調べたところ、提供されている機能が気に入りました。そこで私は、Solr を構成して一部の機能をエンド ユーザーに提供するにはどうすればよいかを考えました。

私たちの製品データは、次のような製品の標準データで構成されています

  • 商品のタイトル
  • 説明
  • 商品が複数のカテゴリとサブカテゴリに属している
  • 製品には、赤、青、緑、S、M、L、XL の T シャツや、16 GB、32 GB の iPad など、複数のバリエーションがあり、オプションがあります。
  • 商品にはブランドがある
  • 製品には小売業者がいます

今のところ、このスキーマ ファイルを使用して、Solr でインデックスを作成し、クエリを実行しています。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateAll="1" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateAll="1" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/>
  </analyzer>
</fieldType>
  • EdgeNGramFilterFactoryのような単語shirtsh, shi, shir,に索引付けしますshirt
  • WordDelimiterFilterFactoryのような単語wi-fiwi, fi, に分割しますwifi
  • PorterStemFilterFactoryステミングに適しています
  • PhoneticFilterFactoryちょっとあいまい検索を提供します

1 つの問題は、あいまい検索がうまく機能しないことです。その本を検索してInfernoスペルを間違えるとInfenro、検索結果が返されません。SpellCheckComponent( http://wiki.apache.org/solr/SpellCheckComponent )について読んだことがありますが、それがあいまい検索を行う最良の方法なのか、それとも 特徴。

2 番目の問題は、Shirts red赤い T シャツ (赤はオプション タイプの色のオプション値) を検索するか、 または を検索するwoman shoesことが可能であるということadidas shoes womanです。Solrでこれを行うことは可能ですか?

schema.xmlそして 3 つ目の問題は、そのような機能を実現するために、内部のトークナイザーとフィルターのどれが適切な選択なのか、私にはわからないということです。

誰かがsolrでそのような機能を使用したことがあり、この場合に私を助けてくれることを願っています. どうも!

編集

以下は、Solr 内に保存するデータの一部です。

<doc>
  <str name="id">572</str>
  <arr name="taxons">
    <str>cat1</str>
    <str>cat1/cat2</str>
    <str>cat1/cat2/cat3</str>
    <str>cat1/cat4</str>
  </arr>
  <arr name="options">
    <str>color_blue</str>
    <str>color_red</str>
    <str>size_39</str>
    <str>size_40</str>
  </arr>
  <int name="count_on_hand">321</int>
  <arr name="name_text">
    <str>Riddle-Shirt Tech</str>
  </arr>
  <arr name="description_text">
    <str>The Riddle Shirt Tech Men's Hoodie features signature details, along with ultra-lightweight fleece for optimum warmth.</str>
  </arr>
  <arr name="brand_text">
    <str>Riddle</str>
  </arr>
  <arr name="retailer_text">
    <str>Supershop</str>
  </arr>
</doc>

キーと値のペアが適切な方法で保存されているかどうかはわかりませんoptionsが、それが最初に思いついた方法です。

4

1 に答える 1

12

免責事項

スキーマについていくつかの仮定を立てたので、スキーマとデータの例で要点を確認してください - https://gist.github.com/rchukh/7385672#file-19854599

たとえば、分類群の場合、PathHierarchyTokenizerFactoryで特別なテキスト フィールドを使用しました。

最初の問題 (あいまい検索):

なぜInferno一致Infenroしないのかという問題は、それが音声上のスペルミスではないためです。光学フィルターは、そのような一致には適していません。

詳細に興味がある場合は、lucene/solr でサポートされているアルゴリズムに関する非常に優れた記事をご覧ください: http://ntz-develop.blogspot.com/2011/03/phonetic-algorithms.html


おそらくSpellCheck Collat​​e機能に興味があるでしょう

http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.collat​​e

ウィキから:

照合とは、元のクエリ文字列に各用語の最適な候補を置き換えたものです。spellcheck.collat​​e が true の場合、Solr は各トークン (存在する場合) に最適な提案を取得し、提案から新しいクエリを作成します。たとえば、入力クエリが「jawa class lording」で、「jawa」の最適な候補が「java」で「lording」が「loading」の場合、結果の照合は「java class loading」になります。


距離アルゴリズムに基づくファジー検索機能を利用することもできます (ただし、私が理解しているように、近接検索などのフレーズ検索の方が便利です)。solr wiki の例を次に示します。

roam~

This search will match terms like foam and roams. It will also match the word "roam" itself.

したがってInfenro~、クエリでInfernoはインデックスで一致する必要があります...しかし、私の賭けは「グーグルのような」アプローチを採用することです:

グーグルのスペルミス

つまり、次の結果は正しいスペルに対するものであることをユーザーに通知しますが、間違ったスペルも使用できるようにします (たまたま、ユーザーが正しく、マシンが間違っている場合があります)。

第二の問題

この問題は edismax で解決できます。たとえば、name_text AND オプションで検索したい場合:

q=shirt%20AND%20red&defType=edismax&qf=name_text%20options

ここで、このクエリの説明計画を見ることができます - http://explain.solr.pl/explains/w1qb7zie


オプションを区切り記号付きの複数値フィールドとして保存する際の問題は、検索クエリがキー (「色」など) との一致を開始することです。

例 - 次のリクエスト:

q=shirt%20AND%20color&defType=edismax&qf=name_text%20options

「色」オプションがあるすべてのシャツに一致します - http://explain.solr.pl/explains/pn6fbpfq

第三の問題

ステマーの後に FilterFactory を使用することに疑問がありますが、現時点では意味のある情報を提供できません。

于 2013-11-09T14:26:53.480 に答える