テキスト内の単語の独立した存在を選択したい
-
16-10-2019 - |
質問
私は次のテキストを含むテーブルを持っています、そして私が探しているキーワードは「検索」です。だから私は質問を書きました
SELECT [ID]
,[TextValue]
FROM
[dbo].[SearchLike]
WHERE
[TextValue] LIKE '%Search%'
Q.1 テキストに「検索」があるレコードのみが返され、「lsearch」を取得しないようにクエリを変更するにはどうすればよいですか。 IEは、最初の3つのレコードのみを返してください。
解決
likeを使用します
検索のようなシングルライン:
WHERE ' ' + [TextValue] + ' ' LIKE '%[.,;:() ]Search[.,;:() ]%' /* [] contains list of allowable characters, adding spaces around [TextValue] removes need to have multiple OR [TextValue] LIKE */
パディングがなければ、文字列の開始/終了時に表示される文字列を特別に処理する必要があります。
WHERE [TextValue] LIKE '%Search%' --middle OR [TextValue] LIKE 'Search%' --start OR [TextValue] LIKE '%Search' --end
FullTextインデックスを使用します
編集2、全文純粋主義者用
CREATE FULLTEXT INDEX
自動オプションのMSDN状態(デフォルト)
変更は自動的に伝播されますが、これらの変更はフルテキストインデックスにすぐに反映されない場合があります。
そのため、正しい結果が得られない場合があります。しかし、その後数秒後になります。
また、最大10k行の場合、適切に実行されます。私は約25k行のテーブルで同様を使用しますが、ユーザーはこの方法で検索すると、それがひどくパフォーマンスを発揮することを知っています(「高度な」ページにあります)。全文インデックスを管理することでトレードオフを獲得します
全文検索はそうではありません 正しい解決策です 1 オプション
ノート: 経験から、SQL ServerでのFullTextインデックスが深刻なパフォーマンスの影響を及ぼしていることがわかりました。つまり、実際に必要な場合にのみ実装し、何をしているのかを知っている場合にのみ実装してください。 (@Andrew Bickerton)
他のヒント
テーブルにわずかな量の行がある場合は、代わりにフルテキストインデックスを試してみてください。それははるかに速くなり、正確な言葉だけで一致します。
CREATE FULLTEXT CATALOG <catalog_name> AS DEFAULT;
CREATE FULLTEXT INDEX ON [dbo].[SearchLike](TextValue)
KEY INDEX pk_id; --requires the existing of a PK or UQ index with this name on this table
今、あなたのテキストを検索してください:
SELECT [ID]
,[TextValue]
FROM
[dbo].[SearchLike]
WHERE
CONTAINS([TextValue], 'Search')
詳細:
SQL Serverがサポートするかどうかはわかりません \b
正規表現(単語の境界に一致)。そして、あなたはしなければなりません 最初に正規表現を許可するユーザー定義関数を作成する, 、しかし、もしそうなら、あなたは次のことを一致させることができます:
\bSearch\b
そうでない場合でも、次のことを一致させることができるはずです。
(^| )Search( |$)