3

ユーザーのコレクションがあります。各ユーザーにはいくつかのフィールドがあります。それらのフィールドの1つは、次のようなマップです。魔女の「キー、値」値は順序を表します。

例えば:

user1もっている:

id    = user1
tags  = <apples, 100>, <bananas, 80>, <oranges, 60>
name  = "Ann Miller"
likes = "apples and skydiving, and sometimes solving puzzles"
quote = "Never spent a day without a smile!"

user2もっている:

id    = user2
tags  = <bananas, 100>, <pears, 80>, <apples, 60>
name  = "Mike Anderson"
likes = "sleep and eating pizza"
quote = "Math, it's a puzzle to me. I love figuring out puzzles."

次のようなユーザーを返す一般的な検索が必要です。

search  |  result order
--------+--------------------
smile   | user1
puzzle  | user2, user1
bananas | user2, user1
apples  | user1, user2

現在、私は魔女に一般的なファイルを提出しており、各フィールドの値をコピーしてから、そのフィールドを検索します。今はペアのキーだけを入れているので、順序は私が望むものではありません。

SolrJを使用して、(データベースから抽出された)ドキュメントのインデックスを作成し、検索します。

リンゴは100回、バナナは80回などの言葉を繰り返すことを考えましたが、それは非常に遅く、痛々しいほど遅いと思います(それを作るのに良い方法ではないことを除けば)。

何か考えがありますか?

4

2 に答える 2

1

アンドレアの提案に取り組むと、解決策は次の行にある可能性があります。

  • 動的フィールドとして値にインデックスを付けます (例:*_valueのようにbanana_value)。
  • eDisMax クエリ パーサー を使用して、 SolrJ を使用して指定する追加のパラメーターであるwhereのようなものを使用して、検索結果をブーストまたは bfします。このパラメーターを介して、クエリ用語 + 動的フィールドのサフィックス(banan_value など) を提供します。関数クエリフィールドのおかげで、その特定のペアの値を取得し、それに応じて結果をブーストします。 bf=field($value_field)value_field
于 2014-12-19T17:01:38.507 に答える
0

うーん、よくわかりませんが、それは不可能だと思います...ソートフィールドは単一値でなければなりません(複数値は意味がありません)。複数値フィールドがあると思います。

ここで、マップの各値を動的フィールドとしてインデックス付けするとします (フィールド名はキーで、フィールド値は対応する重みです)...ここで単一値の問題は解決しましたが、別の興味深い問題が発生しました...並べ替えフィールドは、検索の一致に依存するため、クエリ時に決定できません...

于 2013-01-16T20:13:59.207 に答える