“喜欢或喜欢,或喜欢,或喜欢,或喜欢”的更好方法

Rac*_*SQL 10 sql-server full-text-search sql-server-2008-r2

在这个问题上,他和我有同样的问题。我需要类似的东西:

select * from blablabla 
where product 
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%' 
Run Code Online (Sandbox Code Playgroud)

这是丑陋的,它没有使用索引。

据我了解,使用全文,我可以在一个字符串中选择多个单词。

这个问题也谈到全文

Eri*_*ing 17

全文索引通常不是灵丹妙药,需要额外的维护、磁盘空间和对查询模式的相当侵入性的更改。

除非你真的需要索引大型文档(想想电子邮件正文、PDF、Word 文档等),否则它们是多余的(如果我们说实话,我会完全从 SQL Server 中删除这个过程,并且使用 Elasticsearch 或类似的东西)。

对于较小的用例,计算列通常是更好的方法。

这是一个快速演示设置:

use tempdb

CREATE TABLE #fulltextindexesarestupid (Id INT PRIMARY KEY CLUSTERED, StopAbusingFeatures VARCHAR(100))

INSERT #fulltextindexesarestupid (Id)
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (@@ROWCOUNT))
FROM sys.messages AS m
CROSS JOIN sys.messages AS m2

UPDATE #fulltextindexesarestupid
SET StopAbusingFeatures = CASE WHEN Id % 15 = 0 THEN 'Bad'
                               WHEN Id % 3 = 0 THEN 'Idea'
                               WHEN Id % 5 = 0 THEN 'Jeans'
                               END


ALTER TABLE #fulltextindexesarestupid 
ADD LessBad AS CONVERT(BIT, CASE WHEN StopAbusingFeatures LIKE '%Bad%' THEN 1
                    WHEN StopAbusingFeatures LIKE '%Idea%' THEN 1
                    ELSE 0 END)

CREATE UNIQUE NONCLUSTERED INDEX ix_whatever ON #fulltextindexesarestupid (LessBad, Id)
Run Code Online (Sandbox Code Playgroud)

甚至基于非持久性列的查询为我们提供了一个“使用索引”和所有内容的计划:)

SELECT COUNT(*)
FROM #fulltextindexesarestupid AS f
WHERE LessBad = 1
Run Code Online (Sandbox Code Playgroud)

坚果