0

タイトルは少しぎこちないですが、これ以上のタイトルが見つかりませんでした。私の問題は次のとおりです。

複数のユーザーをドキュメントとして保存しており、ドキュメントごとに複数のキーと値のペアまたはアイテム (ID を持つ) を保存しています。ここで、hl.snippets=5 で強調表示を適用すると、最初の 5 つの項目を取得できます。しかし、すべてのユーザーが数百のアイテムを持つ可能性があるため、

  • 最も関連性の高い 5 項目は得られません。あなたは最初の5つのアイテムを手に入れます...

もう一つの問題は、

  • 強調表示されたテキストには id が含まれないため、強調表示された項目テキストの追加情報を取得するのは見苦しくなります。

アイテムが電子メールである例:

user1 has item1 { text:"developers developers developers", id:1, title:"ms" }
          item2 { text:"c# development",                   id:2, title:"nice!" }
          ...
          item77 ...

user2 has item1 { text:"nice restaurant", id:3, title:"bla"}
          item2 { text:"best cafe",       id:4, title:"blup"}
          ...
          item223 ...

テキストフィールドに強調表示を使用し、「レストラン」に対してクエリを実行すると、 user2 と text が取得されますnice <b>restaurant</b>。しかし、このアイテムのタイトルなど、表示する強調表示されたテキストの ID をどのように決定できますか? そして、より関連性の高いアイテムがアイテムリストの最後にリストされている場合はどうなりますか? ハイライトしてもそれらは表示されません...

では、そのようなアイテムが複数あるドキュメントから最適なアイテムを見つけるにはどうすればよいでしょうか?

私は 2 つの調査結果を回答として追加しましたが、指摘するように、それぞれに独自の欠点があります。

誰かが私にもっと良い解決策を教えてもらえますか?

4

3 に答える 3

1

Solr スキーマを設計するための私の経験則の 1 つは、ドキュメントは検索対象であるということです。

「アイテム」を検索したい場合、これらの「アイテム」はドキュメントです。「ユーザー」などの他のものをどのように保存するかは二次的なものです。したがって、「ユーザー」は、あなたが言及したように別のインデックスにある可能性があり、RDBMSの可用性、「ユーザー」の数、存在する方法に応じて、リレーショナルデータベースなどで「非正規化」される可能性があります(たとえば、各ドキュメントに情報が複製されます)これらの「ユーザー」が持つ多くのフィールドなど。

編集: ここで、「アイテム」は電子メールであり、可能な検索は「レストラン X」であり、最適な「アイテム」(電子メール) を見つけたいと説明します。したがって、ドキュメントは電子メールです。スキーマは、(id、title、text、user) のように単純にすることができます。

強調表示を有効にして、「レストラン X」クエリに一致する「テキスト」または「タイトル」フィールドのスニペットを取得できます。

「restaurant X」について書いたユーザーに関する情報をエンドユーザーに提供したい場合は、「user」フィールドをファセットできます。次にエンドユーザーは、ジョンが「レストラン X」について 10 通のメールを書き、ロバートが 6 通のメールを書いたことを確認します。エンドユーザーは、「このジョン男はこのレストランについてよく知っているに違いない」と考え、「レストラン X」による検索にドリルダウンします。 ' フィルタ クエリを使用user:John

于 2010-06-07T21:29:25.663 に答える
1

質問で説明されているユーザー->アイテムと、ユーザーを参照する「純粋なアイテム」を含むインデックスの2つのインデックスを使用できます。

次に、2 つのクエリが必要になります (これが、質問を「Solr での 2d 検索」と呼んだ理由です)。

  1. ユーザー インデックスをクエリ => 例: 10 ユーザーのリスト
  2. 1 の各ユーザーのアイテム インデックスをクエリします。ステップ => 最良のアイテム

次の例を想定します。

userA のメールは「レストラン X は悪いがレストラン X は安い」、「別の話題」、「別の話題 B」、

userB のメールは、「レストラン X は良くない」、「レストラン X を再訪しましたが、今は大丈夫でした」、「レストラン X に戻ってきましたが、最高だと思います」です。

ここで、「restaurant X」のユーザー インデックスをクエリすると、最初のユーザーは userB になり、これが必要になります。item-index のみを照会すると、関連性の低い userA の item1 が取得されます。

欠点:

  • ユーザー インデックスに対して 1 つのクエリが必要になるため、パフォーマンスが低下します。たとえば、各ユーザーに最も関連性の高いアイテムを取得するには、さらに 10 個のクエリが必要になります。
  • 2 つのインデックスを維持します。

多くのクエリを回避するための更新次のことを試します: ユーザー インデックスを使用して強調表示されたスニペットを取得し、すべてのユーザーに [関連アイテムを取得] ボタンを提供して、アイテム インデックスに対してクエリをトリガーします。

于 2010-06-07T12:04:27.567 に答える
0

折りたたみパッチを使用して、各アイテムをユーザーにリンクする個別のドキュメントとして保存できます。

このアプローチの問題点は、最も関連性の高いユーザーを獲得できないことです。すなわち。最も関連性の高いアイテムが、必ずしも最も関連性の高いユーザーからのものであるとは限りません (関連性の低いアイテムがいくつかある可能性があるため)

2 番目の回答の「次の例を想定する:」の部分を参照してください。

于 2010-06-07T11:59:27.530 に答える