ユーザーが所有する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"は選択しないため、LIKEの方が正確ですが、全文検索では "The"が無視され、両方が返されます。そうは言っても、どちらもより良い結果だったでしょう。
それは正しくありません。全文検索構文を使用すると、検索する「方法」を指定できます。例えば。 [〜#〜] contains [〜#〜] ステートメントを使用すると、正確な用語の一致だけでなく、あいまい一致、重みなども使用できます。
したがって、パフォーマンスの問題がある場合、またはより「Googleのような」検索エクスペリエンスを提供したい場合は、全文検索エンジンを使用してください。設定も非常に簡単です。
ほんの少しのメモ:
LIKEを%で開始しない場合、LIKEはインデックスシークを使用できます。例:LIKE'Santa M% 'は良いです! LIKE '%Maria'は悪いです!また、標準的な方法でインデックスを作成できないため、テーブルスキャンまたはインデックススキャンが発生する可能性があります。
これは非常に重要です。フルテキストインデックスの更新は非同期です。たとえば、テーブルに対してINSERTを実行した後、新しいデータが表示されると予想される全文検索でSELECTを実行すると、データがすぐに取得されない場合があります。構成によっては、数秒または1日待つ必要がある場合があります。通常、フルテキストインデックスは、システムに多くのリクエストがない場合に入力されます。
パフォーマンスは向上しますが、データがたくさんない限り、その違いに気付くことはありません。 SQLフルテキスト検索インデックスを使用すると、単純な「LIKE」操作よりも高度な演算子を使用できますが、フルテキストインデックスに対するLIKE操作と同等の操作を行うだけで、結果は同じになります。
DVDにメモ/説明を入力できるかどうか想像してみてください。この場合、説明で検索できるようにするとよいでしょう。この場合の全文検索は、より良い仕事をします。
わずかに良い結果が得られる場合があります。そうでない場合は、少なくともフルテキストインデックスを使用した実装が簡単になります。しかし、それはあなたがそれをどのように機能させたいかによります...
私が念頭に置いているのは、2つの単語を検索する場合、LIKEを使用して、リストの上位にある両方の単語に重みを付けるメソッドを手動で実装する必要があるということです。フルテキストインデックスはこれを行い、関連する構文を使用して重み付けにも影響を与えることができます。
英語の単語を検索するだけでなく、中国語の単語を検索するとします。ここで例を示したように、ftsが単語をトークン化する方法によって、検索が大きく異なります https://stackoverflow.com/a/ 31396975/30151 。しかし、SQLサーバーが中国語の単語をトークン化する方法がわかりません。それはそれに対して良い仕事をしますか?
SQLServerのFullTextSearch
に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*"')