2

AJAXオートコンプリートの実装は非常に簡単です。しかし、SOでこのようなスマートタグの提案をどのように処理するのか疑問に思います。

オートコンプリート提案の違いを明確にするには:

  • オートコンプリート:foo [foobar、foobaz]
  • 提案:foo [barfoo、foobar、foobaz]、またはさらに良いことに、「もしかして」機能:[barfoo、foobar、foobaz、fobar、fobaz]

タグで全文検索が必要だと思います(単語だけでなく、すべての文字が索引付けされています)。限られた数のタグ(クライアント側でも)に対して正規表現やその他のパタ​​ーンを使用しても問題はありません。

しかし、この機能を多数のタグに実装するにはどうすればよいでしょうか。
SOのタグがダッシュで区切られている(URL以外の)特別な理由はありますか?タグ内のUnicode文字はどうですか?

次の列を持つテーブルにタグを格納します:id、tagname。私のSQLクエリは、id、tagname、countのフィールドを持つオブジェクトを返します

(私はデフォルトのdbドライバーとしてDoctrine ORMとpgsqlを使用しています。)

4

1 に答える 1

3

キーを押すたびに、REGEXPによってデータベースからそれらを選択します。私は自分のサイトでこれを行いましたが、事前の問題はありませんでした(サーバーの負荷が高いとは考えていません)。このアイデアが気に入らない場合は、ユーザーが毎日入力して別のテーブルに更新する1〜5文字の組み合わせをすべて現金化します。このテーブルにインデックスが付けられている場合は、実装が非常に高速です。

2番目のアプローチについてさらに詳しく説明するには:

簡単に説明すると、1。キーワード(3〜4文字に制限)とタグのプライマリIDの間の1-nの関係を表すテーブルSEARCHTABLEを作成します。2.両方のフィールドのINDEX。3.ユーザーが検索を行うたびに、SEARCHTABLEを確認し、組み合わせが存在する場合は、それを使用します。すべてがインデックスに登録されるため、非常に高速です。そうでない場合は、正規表現検索を実行し、すべての結果をSEARCHTABLEに配置します。

ノート:

  1. タグを追加する場合はテーブルを無効にする必要がありますが、これは検索よりもはるかに少ない頻度で行う必要があります。必要のないテーブルを無効にする場合は、すべてのキーワードを考慮して簡単に再構築できます。
  2. 速度を上げたい場合は、2文字または3文字の検索すべてを「事前生成」できます。
  3. 十分に気を配っている場合は、n-1文字のキーワードからの情報を使用してn文字のキーワードを生成する必要があります。それは物事をものすごくスピードアップします。ユーザーが「mo」と入力し、SEARCHTABLEから適切な結果を表示したとします。彼女が「n」と入力して「mon」と入力するよりも、新しい応答を生成するために必要なのは、すでに選択されているアイテムを検索することだけです。

それが今より包括的であることを願っています。

于 2010-04-17T22:05:33.290 に答える