ユーザーが所有するDVDに情報(タイトル、俳優、年、説明など)を保存できる非常にシンプルなアプリがあり、ユーザーがこれらのフィールド(「キアヌリーブス」など)でコレクションを検索できるようにしたいとします。または「マトリックス」は有効な検索クエリになります)。
SQL全文検索を使用することと、クエリをスペースで分割してSQLステートメントでいくつかの「LIKE」句を実行することの利点は何ですか。単にパフォーマンスが向上するのでしょうか、それとも実際にはより正確な結果が返されるのでしょうか。
ユーザーが所有するDVDに情報(タイトル、俳優、年、説明など)を保存できる非常にシンプルなアプリがあり、ユーザーがこれらのフィールド(「キアヌリーブス」など)でコレクションを検索できるようにしたいとします。または「マトリックス」は有効な検索クエリになります)。
SQL全文検索を使用することと、クエリをスペースで分割してSQLステートメントでいくつかの「LIKE」句を実行することの利点は何ですか。単にパフォーマンスが向上するのでしょうか、それとも実際にはより正確な結果が返されるのでしょうか。
全文検索は、レコードの検索に使用する単語のインデックスの恩恵を受けるため、より高速になる可能性がありますが、LIKEを使用すると、全表スキャンが必要になります。
場合によっては、LIKE "%The%" AND LIKE "%Matrix"は "The Matrix"を選択しますが、 "Matrix Reloaded"は選択しないため、LIKEの方が正確ですが、全文検索では "The"が無視され、両方が返されます。そうは言っても、どちらもより良い結果だったでしょう。
フルテキスト インデックス (インデックス) は、LIKE (基本的に各行を毎回調べる) を使用するよりもはるかに高速です。ただし、データベースが小さいことがわかっている場合は、フルテキスト インデックスを使用する必要がない場合があります。これを判断する唯一の方法は、インテリジェントな平均化とその情報に基づくテストです。
精度は別の問題です。フルテキスト インデックス作成を使用すると、LIKE を使用して適切な時間枠で実装することができなかったいくつかのこと (重み付け、自動的に食べる/食べる/食べるなど) を実行できます。本当の問題は、それらの機能が必要かどうかです。
これらの機能に関するドキュメントの全文の説明を読まなければ、実際にどのように進めればよいかわかりません。だから、読んでください!
また、いくつかの基本的なテスト (テーブルに一連の行を挿入し、単語のソースとしてある種の公共辞書を使用することもある) は、決定を支援するのに大いに役立ちます。
全文検索クエリははるかに高速です。特に、さまざまな列で大量のデータを処理する場合。
さらに、言語固有の検索サポートが提供されます。たとえば、"über" の "ü" のようなドイツ語のウムラウトは、"ueber" として格納されている場合にも検出されます。また、検索クエリを自動的に拡張したり、特定のフレーズを置換または置換したりできるシノニムを使用することもできます。
LIKE "%The%" AND LIKE "%Matrix" は "The Matrix" を選択しますが、"Matrix Reloaded" は選択しませんが、全文検索は "The" を無視して両方を返します。つまり、どちらもより良い結果だった可能性が高いということです。
それは正しくありません。全文検索構文では、検索の「方法」を指定できます。たとえば、CONTAINSステートメントを使用することで、完全な用語一致だけでなく、あいまい一致、重みなども使用できます。
したがって、パフォーマンスに問題がある場合や、より「Google に似た」検索エクスペリエンスを提供したい場合は、全文検索エンジンを使用してください。構成も非常に簡単です。
ほんの少しのメモ:
LIKEを%で開始しない場合、LIKEはインデックスシークを使用できます。例:LIKE'Santa M%'は良いです!LIKE'%Maria'は悪いです!また、標準的な方法でインデックスを作成できないため、テーブルスキャンまたはインデックススキャンが発生する可能性があります。
これは非常に重要です。フルテキストインデックスの更新は非同期です。たとえば、テーブルに対してINSERTを実行した後、新しいデータが表示されると予想される全文検索でSELECTを実行すると、データがすぐに取得されない場合があります。構成によっては、数秒または1日待たなければならない場合があります。通常、フルテキストインデックスは、システムに多くのリクエストがない場合に入力されます。
パフォーマンスは向上しますが、データがたくさんない限り、その違いに気付くことはありません。SQL全文検索インデックスを使用すると、単純な「LIKE」操作よりも高度な演算子を使用できますが、全文インデックスに対するLIKE操作と同等の場合、結果は同じになります。
わずかに良い結果が得られる場合があります。そうでない場合は、少なくとも全文索引を使用した簡単な実装が可能です。しかし、それはあなたがそれをどのように機能させたいかによります...
私が念頭に置いているのは、2つの単語を検索する場合、LIKEを使用して、リストの上位にある両方の単語に重みを付けるメソッドを手動で実装する必要があるということです。フルテキストインデックスはこれを行い、関連する構文を使用して重み付けにも影響を与えることができます。
DVD にメモや説明を入力できるようにすることを想像してみてください。この場合、説明による検索を許可するとよいでしょう。この場合、全文検索の方がうまく機能します。
FullTextSearch
SQL Server をLIKE
最初に使用するには、 を作成しStopList
てテーブルに割り当てる必要があります。
CREATE FULLTEXT STOPLIST [MyStopList];
GO
ALTER FULLTEXT INDEX ON dbo.[MyTableName] SET STOPLIST [MyStopList]
GO
次に、次の tSql スクリプトを使用します。
SELECT * FROM dbo.[MyTableName] AS mt
WHERE CONTAINS((mt.ColumnName1,mt.ColumnName2,mt.ColumnName3), N'"*search text s*"')