5

検索候補を作成する最速の方法を考え出そうとしています。最初は、MySQL テーブルと組み合わせた Levenstein UDF 関数が機能すると考えていました。しかし、levenshtein を使用すると、mysql はテーブル内のすべての行 (大量の単語) を調べなければならず、クエリが非常に遅くなります。

最近、Sphinx ( http://sphinxsearch.com/ ) をインストールして全文検索に使い始めました。その主な理由は、そのパフォーマンスと、SphinxSE との mysql の緊密な統合です。

そこで、スフィンクスを使用してパフォーマンスを向上させる「もしかして」アルゴリズムを実装できるかどうか自問したところ、単純なものを見つけたと思います。基本的に、修正したいすべてのキーワードを取得し、各文字の間にスペースを入れてから、スフィンクス インデックスに入れます。単語が「keyword」の場合は「keyword d」になります。ここで、ユーザーが単語を入力すると、それを文字に分割し、提供された文字のいずれかに一致するレコード (必要なのは 1 つだけ) を sphinx インデックスで検索します。最良の部分は、スフィンクスが一致した行の関連性 (重み) を計算するのに非常に優れているため、最適な一致が常に最大の重みを持つことです (私は思います)。また、単語 (私の場合は文字) の位置も考慮されるため、最適な一致はその順序になります。

sphinx クエリを使用すると、キーワード リストで最も類似した単語を取得できます。次に、再配置された文字https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distanceを説明する拡張レーベンシュタイン距離を使用して、php で確認します。文字列の距離が 2 未満 (および != 0) の場合、単語を提案します。それ以外の場合は、何も提案しないでください。

私の考えに問題はありますか?私が考えていなかった何か?スフィンクス クエリで予想される不具合や、最適な一致をもたらさないスフィンクスの関連性計算での癖はありますか? どこか間違っている場合は修正してください。

4

3 に答える 3

3

あなたの考えに問題があるとは思えません。頑張れ。LD に非常によく似た組み込みの動作をオーバーライドする場合にのみ、メソッドが関連することを指摘するだけです。

たとえば、sphinx 1.10-beta では、min_infix_len と expand_keywords を指定し、sphinx の組み込み重み付けメソッド (BM25 といくつかの独自コード) を使用して、良い結果を得ることができます。http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/

これらのクエリを memcache することを忘れずに、ウォームアップ スクリプトを作成してください。

于 2011-02-23T04:44:20.540 に答える
1

入力されたすべての検索クエリと、ユーザーが入力する次の検索クエリをログに記録できます。

多くのユーザーが rhinosorous を検索しているが、実際には rhinoceros を意味していると仮定しましょう。ユーザーはクエリを修正するため、次のクエリとしてサイを含む多くのサイのクエリが存在することになります。

次のような候補を選択できます。

SELECT id, query, next_query, COUNT(id) AS count FROM queries GROUP BY query ORDER BY COUNT(id) DESC

上位の結果に、countそのキーワードに対するすべてのクエリの割合が高い場合は、メッセージを表示します。

私はこれをテストしていません。単なるアイデアです。

于 2012-06-08T15:40:51.883 に答える
0

Andrew Aksyonoff (Sphinx の作者) が Sphinx を介したこのタスクの実装について考えていることを読むのは興味深いと思います - http://habrahabr.ru/blogs/sphinx/61807/ (翻訳者を使用してロシア語から翻訳してください)

于 2011-02-15T05:02:38.450 に答える