5

これはインタビューの質問です。オートコンプリート用の分散バックエンドを設計します。

私は次のように答えます:

オートコンプリートは、指定されたサフィックスによる辞書の検索です。辞書はおそらくトライとして編成されるべきです。辞書は最も頻繁なクエリから作成されていますが、それは別の話です。

今、私は辞書が頻繁に変更されないと仮定します(たとえば、ミリ秒ごとではなく1日1回)。したがって、オートコンプリートクエリを処理する複数のサーバー間で辞書を複製できます(たとえば、ロードバランサーとラウンドロビンポリシーを使用)。

辞書についても考える必要がありますが、これもまた別の話です。

それは意味がありますか?私は何かが足りないのですか?

4

2 に答える 2

1

SOLR 4.0を見てみましょう(solr には trie があり、配布されています)。オートコンプリートがどのように機能するかによって大きく異なります。トライのようなものよりも単なるワイルドカードフィルターの場合、単純なASCIIでは問題ありません...そうでない場合、自動修正が必要な場合はさらに複雑になります。そうは言っても、一般的なフィールド (つまり、SKU または特殊な ID ではない) である場合、トライが良い結果をもたらすとは思えません。

を見てみましょう:

于 2013-03-09T13:57:19.790 に答える
1

正しい質問のようです。トライのアイデアは本当に素晴らしく、 で検索するのに役立ちますlog(n)。変化の頻度は情報に依存するので、正確な時間とは言えませんが、動的に調整します.1日1回変化すると仮定して、ツリーがどれだけ変化したかを確認します。また、境界を指定することもできます (たとえば 10%)。境界を超えた場合は、より頻繁にトライを更新できます。ほとんどの場合、最新ではないため、最新であることの重要性にも依存します。ロードバランサーのアイデアも良いです。

于 2013-03-08T22:39:47.693 に答える