web-dev-qa-db-ja.com

MySQL文字列の最適な一致を実現するためのレーベンシュタインvsマッチvsその他

約190万行のデータベースがあります。私のDBの詳細

サーバー:UNIXソケットを介したローカルホストサーバータイプ:Perconaサーバーサーバーバージョン:5.5.42-37.1-Perconaサーバー(GPL)、リリース37.1、リビジョン727プロトコルバージョン:10ユーザー:**** @ localhostサーバー文字セット:UTF-8 Unicode (utf8)

現在使用中:

[〜#〜] fullindex [〜#〜]列で次のアルゴリズムを使用していますまず、必要な文字列を以下のように照合しますクエリ

_SELECT title FROM my_db WHERE MATCH (`Title`) AGAINST ('my string' IN BOOLEAN MODE) 
_

次に、結果行サーバー側でlevenstein() distance関数を使用してPHPを通じて文字列に最も近い一致を取得します。

私の質問:

  1. そのような巨大なデータベースの全文に対して、MATCH AGAINSTの代わりに完全にレーベンシュタインを実装する方が速いでしょうか?
  2. レーベンシュタインよりも優れた実装可能なアルゴリズムはありますか、それとも今のところそのような最良のアルゴリズムは存在しますか?
  3. MATCHまたはlevenshtein()の代わりに他の回避策はありますか?
  4. 以下はそれぞれどうでしょう 検索修飾子

自然言語モード、クエリ拡張付き自然言語モード、ブールモード、クエリ拡張あり

検索と結果を強化または最適化しますか?したがって、どちらが最適でしょうか?

ありがとう!

3

FULLTEXTインデックスは、巨大なテーブルの小さな結果セットに対して非常に効率的です。 levenshteinを使用するには、各行をチェックする必要があります。したがって、最初のステップとしてFTを行うというあなたのアプローチに同意します。

提案する

  1. 文字列から短い単語などを削除します。 (MyISAMはそれらを無視するため必要ありません。InnoDBには必要です。それ以外の場合は何も返しません)
  2. IN BOOLEAN MODEただし、単語に "+"を付けません。
  3. ORDER BY MATCH... DESCLIMITを追加します。これにより、Edgeケースが次のステップで数千行になることを防ぎます。
  4. levenshtein距離を確認してください。

最終結果は完全ではありませんが、少なくとも「十分に高速」である必要があります。

1
Rick James