0

正確な名前、または姓名のプレフィックスで友人を検索するソリューションを探していました。私の要件は、このリンクに似たものです。Sphinx vs. MySql - 友達のリスト (効率/速度) を検索します が、投稿ではその方法について説明していません。スフィンクスを介して関係を検索することはお勧めできません。次のアプローチのいずれかを使用するか、まったく異なるアプローチを使用する必要があるかどうか、誰でも提案できますか。また、たとえば 100 万件以上のレコードの高速性とスケーラビリティを探しています

DB構造も似たようなものです。

InnoDB

table1- users: uid、fname、lname、city、country、picurl、status (picurl と status はいつでも変更される可能性があり、sphinx はリアルタイムではなく、これら 2 つのフィールドの私の設計では 10 分の遅延さえ許容できないと言うか想像してください。 )

table2- 友達: uid,fid

目標は、検索することです。「uid 11」のすべての友人で、fname、lname、またはフルネームに接頭辞「tony」があり、詳細を引き出します。

  • アプローチ 1:

Sphinx: uid、fname、lname で検索 (属性: 都市、国)

a)mysql検索を実行して、「uid 11」のフレンドIDを引き出し、配列Xに保存します

b) 次に、配列 X によってフィルタリングされた docid の 'tony*' をスフィンクス検索します。

c) 次に、mysql 検索を再度実行して、一致するフレンド ID ごとに picurl,status などのリアルタイム フィールドを取得します。

また

  • アプローチ 2:

Sphinx: uid、fname、lname (属性: 都市、国) で検索 + MVA: フレンド ID (すべてのフレンド ID を保存するための MVA)

a)uid「11」を含むMVAでフィルタリングされた「tony *」のスフィンクスを検索します

b) 次に、mysql 検索を実行して、一致する各フレンド ID の picurl,status などのリアルタイム フィールドを取得します。

  • アプローチ 3:

スフィンクスなし

a) Mysql は、「uid 11」の友人を検索します。ここで、「tony%」のような fname または「tony%」のような lname OR CONCAT(fname, ' ', lname) LIKE 'tony stark%' OR CONCAT(lname, ' ', fname) LIKE 'tony stark%' と同じクエリ結合で詳細を引き出します (他の投稿から、これは多数のレコードのパフォーマンスが低いようです)

  • アプローチ 4:

    助言がありますか?


PS: 私の次の課題は、友達の友達を検索することです。質問ヘッダーは..

4

1 に答える 1

0

アプローチ2をお勧めします

しかし、アプローチ 4 の場合、おそらく専用のグラフ データベースを使用することになります。(またはmysql専用のエンジン)-プレフィックス検索だけでは、厳密にはsphinxのようなものは必要ありません。

于 2013-05-24T17:04:55.633 に答える