【问题标题】:SQL Server full text search and spacesSQL Server 全文搜索和空格
【发布时间】:2016-09-21 06:35:10
【问题描述】:

我有一列包含产品名称。有些名字看起来像'ab-cd''ab cd' 当用户键入“abc”(不带空格)时,是否可以使用全文搜索来获取这些名称? like 运算符为我工作,但我想知道是否可以使用全文搜索。

【问题讨论】:

  • 全文搜索是面向语言的。它适用于单词和短语。你不应该期望它可以使用它已经用来分隔单词的空格或标点符号。

标签: sql sql-server search text


【解决方案1】:

不,很遗憾,您无法通过全文进行此类搜索。在这种情况下,您只能使用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

【讨论】:

  • 我不明白你的评论。 OP 写道:当用户键入“abc”(不带空格)时,是否可以使用全文搜索来获取这些名称,那么“不使用 FTS”又如何呢?请澄清一下。
  • 抱歉,没有阅读您的回答。但是,我不认为将所有单词连接成一个超级术语是一个明智的解决方案。如果超级字词不是以您的第一个搜索字词开头,您会怎么做。
  • 你是对的,这是一个问题。谢谢,我应该将此信息添加到我的答案中。
【解决方案2】:

没有。全文搜索基于单词和短语。它不存储原始文本。事实上,根据配置,它甚至不会存储所有单词——所谓的停用词永远不会进入索引。示例:在英语中,“in”这个词的选择性不够,不值得存储。

有些名字看起来像‘ab-cd’‘ab cd’

那些可能根本不会被存储。至少第二个例子实际上是 2 个非常短的词——很可能它们被完全忽略了。

所以,不——全文搜索不适合这个。

【讨论】:

  • 实际上,ab 和 cd 不是默认停用词列表中的单词,因此不会被忽略,但您是对的,您在搜索实际停用词/噪音词时会遇到问题。
  • 我不确定是否还有最小字长 - 因此可能会简单地忽略 ab 和 cd。
  • ‘ab-cd’ ‘ab cd’ - 这不是一个真实的数据,只是一个例子。感谢您的回答——“全文搜索不适合这个”——这就是我想知道的
  • @TomTom,我确定并且没有最小字长。
【解决方案3】:

如果您想使用 FTS 来查找彼此相邻的词,例如用空格分隔的词,您应该使用邻近词。

您可以通过在搜索表达式as documented here 中使用NEAR 关键字或~ 运算符来定义邻近词。

因此,如果您想查找ab 后跟cd,您可以使用表达式,

'NEAR((ab,cd), 0)'

搜索单词ab,后跟单词cd,中间有0个词。

【讨论】:

  • 但是如果用户将“abc”放在搜索字符串中,我现在应该如何创建“NEAR((ab,cd), 0)”?
  • @serg88,大概你必须解析文本并搜索'abc|a-bc|ab-c|a-b-c|NEAR((a, bc), 0)|NEAR((ab, c), 0)|NEAR((a, b, c), 0)',随着字符串长度的增加,你可以看到复杂性会呈指数级增长。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 2011-06-10
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多