2

これは、(リレーショナル) データベースを使用した全文検索の設計に関するシステム アーキテクチャに関する質問です。私が使用している特定のソフトウェアは、Solr と PostgreSQL です。参考までに。

Andy と Betty という 2 人のユーザーがいるフォーラムを構築しているとします。

Post ID | User  | Title             | Content
--------|-------|-------------------|---------------------------
1       | Andy  | Dark Knight rocks | Dark Knight rocks blah
2       | Betty | I love Twilight   | Twilight blah blah
3       | Andy  | Twilight sucks    | Twilight sucks blah
4       | Betty | Andy sucks        | Twilight rocks, Andy sucks

投稿テーブルが Solr でインデックス化されると、関連性によって並べ替えられた投稿を「?q=twilight」または「?q=dark+night」に簡単に返すことができます。

ここで、投稿の代わりにユーザーを検索する新しい機能を追加したいと考えています。単純な実装では、単純にユーザー名をインデックス付けして、"Andy" を "?q=a" に、"Betty" を "?q=b" に返しますが、システムをよりスマートにしてユーザーも考慮したい場合はどうでしょうか。Betty は Andy よりも Twilight に言及しているため、"Andy" の前に"Betty" を "?q=twilight" に投稿して返します。

何十万ものユーザーと何百万もの投稿のユーザー検索機能を効率的に処理するには、どのようにシステムを設計しますか?

4

2 に答える 2

1

ファセットをオンにUserすると、ユーザーごとの結果数が返されます。Andy がTwilight に一致する15の投稿を書き、Betty が 10 を書いた場合、ファセットはそれらをそのように返します。

しかし、どちらもトワイライトに関する 15 の投稿を書いたとしても役に立ちませんが、アンディの方がより関連性があるはずでした。(たとえば) 上位 5 つの結果のみを表示するためにページを移動し、Andy がそのうちの 4 つを作成した場合でも、すべてのファセット数 (この場合は 15、15) が表示されます。


上記の解決策が十分でない場合は、ドキュメントを書き込むバックグラウンド ジョブを検討してください。

type: suggest_user_type (so you can distinguish them by a `fq`)
user: Andy (the user)
concatted_posts: "I think Twilight.." (concatenate the users latest 50 posts)

週に一度。そしてもしあなたが

fq=type:suggest_user_type&
q=concatted_posts:twilight&
fl=user

との関連性に基づいてソートされたユーザーのリストを取得しconcatted_postsますtwilight

于 2012-12-07T13:52:25.943 に答える
0

用語の頻度は、全文検索のランキングに含まれていると思います。情報検索と呼ばれる研究領域の一部です。逆ドキュメント頻度と呼ばれる別の値もあり、一般的な用語を除外します。

テキストのランク付けに共通するステップは他にもあります。興味がある場合は、 OpenNLPプロジェクトを参照してください。

データベースの設計に関しては、記事でカバーするには多すぎるので、私はそれを書く人ではありません。一般的なコンセンサスは、非常に大規模なシステムの場合、効率的なインデックスを構築し、これを多数のマシンに分散してパフォーマンスをスケーリングすることであると思われます。ページランクと、Google がどのようにシステムを開発したかを出発点として読むことをお勧めします。

于 2012-12-07T10:58:52.203 に答える