SQL の「全文検索」について言及している投稿を読みました。
FTSとLIKEの違いは何だろうと思っていました。いくつかの記事を読みましたが、それをうまく説明しているものは見つかりませんでした。
SQL の「全文検索」について言及している投稿を読みました。
FTSとLIKEの違いは何だろうと思っていました。いくつかの記事を読みましたが、それをうまく説明しているものは見つかりませんでした。
一般に、「精度」と「再現率」の間にはトレードオフがあります。精度が高いということは、関連性のない結果が少なく表示される (偽陽性がない) ことを意味し、再現率が高いということは、関連する結果が失われることが少ない (偽陰性がない) ことを意味します。LIKE 演算子を使用すると、リコールの譲歩なしで 100% の精度が得られます。全文検索機能により、再現率を高めるために精度を調整する柔軟性が大幅に向上します。
ほとんどの全文検索の実装では、「逆インデックス」が使用されます。これは、キーが個々の用語であり、関連付けられた値が用語を含むレコードのセットであるインデックスです。全文検索は、これらのレコード セットの交差、結合などを計算するように最適化されており、通常、特定のレコードが検索キーワードとどの程度一致するかを定量化するランキング アルゴリズムを提供します。
SQL LIKE 演算子は非常に非効率的です。インデックスのない列に適用すると、一致を見つけるためにフル スキャンが使用されます (インデックスのないフィールドに対するクエリと同様)。列にインデックスが付けられている場合、インデックス キーに対して照合を実行できますが、ほとんどのインデックス ルックアップよりも効率が大幅に低下します。最悪の場合、LIKE パターンの先頭にワイルドカードがあり、すべてのインデックス キーを調べる必要があります。対照的に、多くの情報検索システムでは、選択したフィールドのサフィックス ツリーを事前にコンパイルすることにより、先頭のワイルドカードのサポートを有効にすることができます。
全文検索に典型的なその他の機能は次のとおりです。
FTS では、テキスト フィールド内の個々の単語にインデックスを付けて、多くのレコードをすばやく検索できるようにします。LIKE を使用しても、フィールド内で文字列検索 (線形検索など) を行う必要があります。
like はワイルドカードのみを使用し、それほど強力ではありません。
全文を使用すると、And、Or、Not、類似した結果 (SOUNDEX) など、さらに多くの項目を含む、はるかに複雑な検索が可能になります。
SQL CONTAINS() FREETEXT() および関連する全文検索項目を調べて、何が利用可能かをよりよく理解できるようにします。
本当の違いは、スキャン方法です。全文検索では、単語 (ターム) がハッシュ キーとして使用されます。各キーは、キー (ターム) が表示されるドキュメントの配列に関連付けられています。次のようになります。
Document sets = {d1, d2, d3, d4, ... dn}
Term sets = {t1, t2, t3, .. tn}
用語と文書のマトリックス (どの文書のどの用語メンバー) は、次のように表すことができます。
t1 -> {d1, d5, d9,.. dn}
t2 -> {d11, d50, d2,.. dn}
t3 -> {d23, d67, d34,.. dn}
:
tn -> {d90, d87, d57,.. dn}
「単語/用語 t1 を含むすべてのドキュメントを取得してください」という要求が来ると、ドキュメント セット{d1, d5, d9,.. dn
} が返されます。
非正規化されたテーブル スキーマをハックしてドキュメントを格納することができます。MySQL テーブルの各行は「ドキュメント」と見なされ、TEXT 列には段落などが含まれる可能性があります。逆インデックスには、ハッシュ キーおよび行 ID として用語が含まれます。ドキュメントIDとして。
この SQL クエリは、多かれ少なかれ O(1) パフォーマンスを持つことに注意してください。クエリは独立しています
たとえば、次の SQL を起動して、指定された単語 XYZ に一致するすべての行を抽出できます。
SELECT *
FROM my_table
WHERE MATCH (my_text_column) against ('XYZ' IN boolean mode) ;
警告: このクエリに ORDER BY を追加すると、実行時間はいくつかのパラメーターに基づいて変化します。そのうちの 1 つは、一致する行/ドキュメントの数です。だから用心してください。
ただし、LIKE にはこれがありません。文/文字列を線形にスキャンし、一致するすべての用語を見つける必要があります。ワイルドカードを追加すると混乱が増します。ご想像のとおり、短い文字列ではうまく機能しますが、長い文では惨めに失敗します。そして、段落やページ全体のテキストなどがある場合は、間違いなく比較できません.
FTS はより効率的で強力です (特にワード ブレーカーとステミング機能の場合)。ただし、DB がすべての言語をサポートしていない場合があるため、要件を確認してください。たとえば、MSSQL はギリシャ語をサポートしていません (このページhttp://msdn. microsoft.com/en-us/library/ms176076(v=sql.110).aspx )