0

Spring Java Web サイトの MySql データベースには、次のテーブルがあります。

  • お客様
  • 製品
  • PRODUCT_CUSTOMER_XREF (商品を購入した顧客)
  • CUSTOMER_CUSTOMER_XREF (他の顧客と友人関係にある顧客)

SOLR では、PRODUCT_ID という一意の ID を持つすべての製品にインデックスを付けました。

私の仕事

  • 現在ログインしている CUSTOMER の友人が過去に購入した PRODUCTS を表示します。
  • 過去に行った顧客の友人の製品説明と製品レビューを顧客が検索できるようにする

私が使用した手順

  • SQL クエリ現在ログインしている CUSTOMER の友人を取得します (500 の CUSTOMERS を返します)
  • JOIN SQL QUERYすべての友人 CUSTOMER が購入した PRODUCT(s) を取得します (98,000 PRODUCTS_ID を返します)。これはおそらく500,000を返す可能性があります
  • SOLR クエリid:(1 2 3 4 5 ....98000) は maxBooleanClause 例外を返します。
  • MySQL クエリ- 返品商品 ID を購入またはコメントした顧客の友人を取得します。

問題- solr クエリ

  • これは maxBooleanClause 例外を返すため、SOLR で 98,000 以上の製品をクエリできません。solr-config.xml ファイルで maxBoolean を増やすことはできますが、この数が 10 万単位であることを考えると、これは悪い習慣のように思えます。
  • 同じフィールドに 98,000 以上のクエリを追加できますが、これも悪い習慣のように思えます。
  • HTTP ポスト経由で 98,000 以上の ID を SOLR サーバーに送信するにはコストがかかります。

誰かが解決策を手伝ってくれますか?

追記: 特定の製品を購入またはコメントしたすべての CUSTOMER_ID を 1 つの番号またはトークンまたは何らかの種類にグループ化し、ログインしている CUSTOMER の ID の友人 ID がそのグループに属しているかどうかを確認する方法があるかどうかを考えていました。しかし、まだ式を考え出していません。

4

2 に答える 2

2

私はこのようなことを試してみます...

ソルインデックス

  • ID
  • 名前
  • 友達
  • Products_Purchased

製品

  • ID
  • 題名

    1. 最初のクエリ -fq=friends:id&facet.field=Products_Purchased
    2. これにより、ユーザーが友達である人物のみに結果が制限されます
    3. また、購入した製品のファセットは、製品の数による順序になります。
    4. これにより、製品の一意の ID も確保されます。

    5. 2 番目のクエリ - これらの Id を使用して、おそらく最大 20 ~ 50 のバッチでページネーションを使用して solr をクエリします。

    6. ページネーションはファセットにも有効であるため、結果をナビゲートできます。
于 2013-06-04T04:07:00.623 に答える
1

1 回のリクエストですべてのアイテムを取得するよりも、いくつかのリクエストに分割することができます。

しかし、私は別のアプローチに切り替える方が良いかもしれません:)

このアイテムを購入した顧客もSolrに保存できます。

したがって、計画は次のように変更されます。

SQL クエリ 現在ログインしている CUSTOMER の友人を取得します (500 の CUSTOMERS を返します) SOLR クエリの顧客:(1 2 3 4 5 ....500) と検索要求。

これには、一部の顧客がアイテムを購入またはコメントしたときにSolrを更新する必要がありますが、READフェーズで勝ちます。solr クエリなどはよりシンプルで、参加リクエストを行う必要はありません。

于 2013-07-02T15:44:14.003 に答える