sp_BlitzErikの答えには多くの良い点がありますが、それがフルテキスト検索を使用すべきではない理由だとは思いません。全文検索は、あなたが思っていることを実行するためのものではありません。複数のフィールドを検索するためのものではありません。単語の内容をベクトル化し、辞書、スタブ、字句解析器、地名辞典、ストップワードの除去、および他に適用されない多くのトリックを利用するためにあります。または、まだ適用されることが示されていません。
SQL Serverでこれをより適切に行う方法はわかりませんが、解決策にも同意しません。PostgreSQL用に彼のデータを再作成してみましょう-PostgreSQLで作成する方がずっとクリーンです。
CREATE TABLE fulltextindexesarestupid
AS
SELECT
id,
CASE WHEN Id % 15 = 0 THEN 'Bad'
WHEN Id % 3 = 0 THEN 'Idea'
WHEN Id % 5 = 0 THEN 'Jeans'
END AS StopAbusingFeatures
FROM generate_series(1,1000000) AS id;
ここで必要なのは列挙型です。
CREATE TYPE foo AS ENUM ('Bad', 'Idea', 'Jeans');
ALTER TABLE fulltextindexesarestupid
ALTER StopAbusingFeatures
SET DATA TYPE foo
USING StopAbusingFeatures::foo;
これで、文字列を整数表現に折りたたみました。しかし、以前と同じようにクエリを実行できます。
SELECT *
FROM fulltextindexesarestupid
WHERE StopAbusingFeatures = 'Bad';
これには効果があります。
- カテゴリが列挙型であることを隠します。その複雑さはタイプにカプセル化され、ユーザーから隠されます。
- また、タイプのこれらのカテゴリにメンテナンスを配置します。
- それは標準化されています。
- 行サイズは大きくなりません。
これらの利点がなければ、基本的には文字列比較を最適化しようとするだけです。しかし、悲しいかな、提案のコードを考えると、sp_BlitzErikがどのようにして答えに到達するかさえわかりません。
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%'
enum、またはsp_BlitzErikによって提案されたハンドローリングメソッドを使用して、トークンを整数に折りたたむことができますが、折りたたむことができる場合は、なぜアンアンカーのように行うのですか?つまり、「%pasta%」がトークン「pasta」であることを知っている場合、なぜ%
その両側にがあるのでしょうか。'%'がないと、これは等価チェックであり、テキストとしてもかなり高速になります。