0

私は Solr を初めて使用するので、これが最善の方法かどうかわかりません。

いくつかのカテゴリに分類されるいくつかの製品があります。カテゴリは、次のような階層構造で編成されています。

- Electronics
  - Computer
    - Apple
      - iPads
      - Macbooks
    - Samsung
    - Notebooks
  - Photo
- Fashion
  - Women
  - Men
    - Shirts

すべての製品に複数のカテゴリを設定できます。たとえば、製品は と にある可能性がElectronics > Computer > Apple > MacbooksありElectronics > Computer > Notebooksます。の製品をリストするとElectronics、すべてのサブカテゴリを含むすべての基本製品が返されます。の製品をリストするとElectronics > Computer、そのサブカテゴリの製品のみが返されます。

私のショップは Rails にあり、Sunspot を Solr の DSL として使用しています。太陽黒点には、 と を持つ というフィールドcategory_namesmultiple: trueありstored: trueます。このフィールドには、次のように Solr に格納されているルートから最も深いサブカテゴリまで、複数のカテゴリを格納します。

<arr name="category_names_sms">
  <str>Electronics</str>
  <str>Electronics#Computer</str>
  <str>Electronics#Computer#Notebooks</str>
  <str>Electronics#Computer#Apple</str>
  <str>Electronics#Computer#Apple#Macbooks</str>
</arr>

すべてのカテゴリをファセット検索として取得したい場合は、Solr を で呼び出すだけで、次facet=true&facet.field=category_namesのような sth が返されます

<lst name="facet_counts">
  <lst name="facet_queries"/>
  <lst name="facet_fields">
    <lst name="taxon_names_sms">
      <int name="Electronics">2831</int>
      <int name="Electronics#Computer">1988</int>
      <int name="Electronics#Computer#Apple">543</int>
      ...
    </lst
  </lst
</lst>

特定のカテゴリの製品のみを取得したい場合、Solr を呼び出すとfq=category_names:Electronics、そのカテゴリのすべての製品が返されます。また、すべての製品にはルート カテゴリへのパスも含まれているため、サブカテゴリからも製品を取得します。

ピボット ファセット、階層ファセットに関する記事をいくつか読みましたが、Solr の機能を正しく使用しているかどうか、少し混乱しています。私の質問は次のとおりです。

  • このアプローチは良いものですか?または、想像できる欠点はありますか?クライアント側でカテゴリを分割して解析するためにハッシュタグを使用して#いますが、これは私が気に入らない点です。
  • もう 1 つの問題は、Solr からカテゴリをフェッチするときに、カテゴリの名前しかないことです。ただし、ID またはカテゴリへのパーマリンクも必要です。そのような情報を Solr に保存する方法はありますか? この情報についてデータベースにアクセスしたくありません。
  • この階層カテゴリ全体をより適切に処理する、Solr のビルドイン ソリューションはありますか?
  • 現在、sunspot のデフォルトの solr XML 構成のみを使用しています。フィールドの定義などについて読んだことがあります。誰かが私に説明できますか、それを太陽黒点で使用する方法は?

どうもありがとう、誰かが私を正しい方向に押し上げてくれることを願っています。

4

2 に答える 2

0
  1. 私もその解決策が好きではありません。

  2. カテゴリー名が変わったらどうする?そのカテゴリのすべての製品を再インデックスする必要があります。1 つの db クエリを実行する方が良い方法だと思います。

  3. Solr はピボット ファセットをサポートしています。だからあなたはそれを使うことができます:

    カテゴリのレベルが無制限の場合、動的フィールドを使用する必要があります:

    <field name="categories" type="int" indexed="true" stored="true" multiValued="true"/>

    <dynamicField name="category_*" type="int" indexed="true" stored="true" multiValued="true"/>

    Electronicsからの製品を取得する場合(たとえば、id が 20 で level が 1 の場合):

    fq=categories:20&fq={!tag=no_subcat}NOT category_2:[* TO *]

    また、 Electronicの子カテゴリと子カテゴリのファセットを構築できます。

    facet.pivot={!ex=no_subcat}category_2,category_3

  4. ルビーは使ったことがありません。

于 2013-08-13T13:49:57.797 に答える
0

あなたが持っている構造は非常に複雑であることがわかります.Solrでそのようにしないことをお勧めします.

Solr 4.0+ は制限付きの結合機能を実行できますが、それは彼の長所ではありません。この記事を見てください(特に「階層と関係がSolrを悲しくさせる」部分): http://bibwild.wordpress.com/2011/01/24/thinking-like-solr-its-not-an-rdbms/

これは、Solr で最適に動作するようにデータベースを非正規化する方法に関するヘルプです: http://mysolr.com/tips/denormalized-data-structure/

于 2013-08-12T07:24:14.387 に答える