【发布时间】:2016-09-21 06:35:10
【问题描述】:
我有一列包含产品名称。有些名字看起来像'ab-cd''ab cd'
当用户键入“abc”(不带空格)时,是否可以使用全文搜索来获取这些名称? like 运算符为我工作,但我想知道是否可以使用全文搜索。
【问题讨论】:
-
全文搜索是面向语言的。它适用于单词和短语。你不应该期望它可以使用它已经用来分隔单词的空格或标点符号。
标签: sql sql-server search text
我有一列包含产品名称。有些名字看起来像'ab-cd''ab cd'
当用户键入“abc”(不带空格)时,是否可以使用全文搜索来获取这些名称? like 运算符为我工作,但我想知道是否可以使用全文搜索。
【问题讨论】:
标签: sql sql-server search text
不,很遗憾,您无法通过全文进行此类搜索。在这种情况下,您只能使用LIKE LIKE ('ab%c%')
EDIT1:
您可以创建一个视图 (WITH SCHEMABINDING!),其中包含一些 id 和要在其中搜索的列名:
CREATE VIEW dbo.ftview WITH SCHEMABINDING
AS
SELECT id,
REPLACE(columnname,' ','') as search_string
FROM YourTable
然后创建索引
CREATE UNIQUE CLUSTERED INDEX UCI_ftview ON dbo.ftview (id ASC)
然后在search_string字段上创建全文搜索索引。
之后,您可以使用"abc*" 搜索运行CONTAINS 查询,它会找到您需要的内容。
EDIT2:
但如果search_string 不以您的搜索词开头,则无济于事。
例如:
ab c d -> abcd 然后你搜索cd
【讨论】:
没有。全文搜索基于单词和短语。它不存储原始文本。事实上,根据配置,它甚至不会存储所有单词——所谓的停用词永远不会进入索引。示例:在英语中,“in”这个词的选择性不够,不值得存储。
有些名字看起来像‘ab-cd’‘ab cd’
那些可能根本不会被存储。至少第二个例子实际上是 2 个非常短的词——很可能它们被完全忽略了。
所以,不——全文搜索不适合这个。
【讨论】:
ab 和 cd 不是默认停用词列表中的单词,因此不会被忽略,但您是对的,您在搜索实际停用词/噪音词时会遇到问题。
如果您想使用 FTS 来查找彼此相邻的词,例如用空格分隔的词,您应该使用邻近词。
您可以通过在搜索表达式as documented here 中使用NEAR 关键字或~ 运算符来定义邻近词。
因此,如果您想查找ab 后跟cd,您可以使用表达式,
'NEAR((ab,cd), 0)'
搜索单词ab,后跟单词cd,中间有0个词。
【讨论】:
'abc|a-bc|ab-c|a-b-c|NEAR((a, bc), 0)|NEAR((ab, c), 0)|NEAR((a, b, c), 0)',随着字符串长度的增加,你可以看到复杂性会呈指数级增长。