約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を通じて文字列に最も近い一致を取得します。
私の質問:
MATCH
またはlevenshtein()
の代わりに他の回避策はありますか?自然言語モード、クエリ拡張付き自然言語モード、ブールモード、クエリ拡張あり
検索と結果を強化または最適化しますか?したがって、どちらが最適でしょうか?
ありがとう!
FULLTEXT
インデックスは、巨大なテーブルの小さな結果セットに対して非常に効率的です。 levenshteinを使用するには、各行をチェックする必要があります。したがって、最初のステップとしてFTを行うというあなたのアプローチに同意します。
提案する
IN BOOLEAN MODE
ただし、単語に "+"を付けません。ORDER BY MATCH... DESC
とLIMIT
を追加します。これにより、Edgeケースが次のステップで数千行になることを防ぎます。levenshtein
距離を確認してください。最終結果は完全ではありませんが、少なくとも「十分に高速」である必要があります。