158

SQL の「全文検索」について言及している投稿を読みました。

FTSとLIKEの違いは何だろうと思っていました。いくつかの記事を読みましたが、それをうまく説明しているものは見つかりませんでした。

4

6 に答える 6

193

一般に、「精度」と「再現率」の間にはトレードオフがあります。精度が高いということは、関連性のない結果が少なく表示される (偽陽性がない) ことを意味し、再現率が高いということは、関連する結果が失われることが少ない (偽陰性がない) ことを意味します。LIKE 演算子を使用すると、リコールの譲歩なしで 100% の精度が得られます。全文検索機能により、再現率を高めるために精度を調整する柔軟性が大幅に向上します。

ほとんどの全文検索の実装では、「逆インデックス」が使用されます。これは、キーが個々の用語であり、関連付けられた値が用語を含むレコードのセットであるインデックスです。全文検索は、これらのレコード セットの交差、結合などを計算するように最適化されており、通常、特定のレコードが検索キーワードとどの程度一致するかを定量化するランキング アルゴリズムを提供します。

SQL LIKE 演算子は非常に非効率的です。インデックスのない列に適用すると、一致を見つけるためにフル スキャンが使用されます (インデックスのないフィールドに対するクエリと同様)。列にインデックスが付けられている場合、インデックス キーに対して照合を実行できますが、ほとんどのインデックス ルックアップよりも効率が大幅に低下します。最悪の場合、LIKE パターンの先頭にワイルドカードがあり、すべてのインデックス キーを調べる必要があります。対照的に、多くの情報検索システムでは、選択したフィールドのサフィックス ツリーを事前にコンパイルすることにより、先頭のワイルドカードのサポートを有効にすることができます。

全文検索に典型的なその他の機能は次のとおりです。

  • 字句解析またはトークン化 — 構造化されていないテキストのブロックを個々の単語、フレーズ、および特別なトークンに分割します
  • 形態素分析、またはステミング - 特定の単語のバリエーションを 1 つの索引語にまとめる。たとえば、「マウス」と「マウス」、または「電化」と「電気」を同じ単語として扱う
  • ランキング - クエリ文字列と一致するレコードの類似性を測定する
于 2008-10-22T07:08:04.183 に答える
42

FTS では、テキスト フィールド内の個々の単語にインデックスを付けて、多くのレコードをすばやく検索できるようにします。LIKE を使用しても、フィールド内で文字列検索 (線形検索など) を行う必要があります。

于 2008-10-22T07:04:44.983 に答える
18

like はワイルドカードのみを使用し、それほど強力ではありません。

全文を使用すると、And、Or、Not、類似した結果 (SOUNDEX) など、さらに多くの項目を含む、はるかに複雑な検索が可能になります。

SQL CONTAINS() FREETEXT() および関連する全文検索項目を調べて、何が利用可能かをよりよく理解できるようにします。

于 2008-10-22T07:05:11.770 に答える
12

本当の違いは、スキャン方法です。全文検索では、単語 (ターム) がハッシュ キーとして使用されます。各キーは、キー (ターム) が表示されるドキュメントの配列に関連付けられています。次のようになります。

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) パフォーマンスを持つことに注意してください。クエリは独立しています

  1. TEXT 列の単語/用語の数
  2. 条件に一致する行/ドキュメントの数
  3. 単語/用語の長さ

たとえば、次の SQL を起動して、指定された単語 XYZ に一致するすべての行を抽出できます。

SELECT * 
FROM   my_table 
WHERE  MATCH (my_text_column) against ('XYZ' IN boolean mode) ;

警告: このクエリに ORDER BY を追加すると、実行時間はいくつかのパラメーターに基づいて変化します。そのうちの 1 つは、一致する行/ドキュメントの数です。だから用心してください。

ただし、LIKE にはこれがありません。文/文字列を線形にスキャンし、一致するすべての用語を見つける必要があります。ワイルドカードを追加すると混乱が増します。ご想像のとおり、短い文字列ではうまく機能しますが、長い文では惨めに失敗します。そして、段落やページ全体のテキストなどがある場合は、間違いなく比較できません.

于 2015-04-01T05:04:35.393 に答える
3

FTS はより効率的で強力です (特にワード ブレーカーとステミング機能の場合)。ただし、DB がすべての言語をサポートしていない場合があるため、要件を確認してください。たとえば、MSSQL はギリシャ語をサポートしていません (このページhttp://msdn. microsoft.com/en-us/library/ms176076(v=sql.110).aspx )

于 2012-02-09T15:13:22.100 に答える