【问题标题】:SQL Server fulltext contains not working in some wordsSQL Server 全文包含在某些单词中不起作用
【发布时间】:2020-04-03 21:16:44
【问题描述】:

我有一个全文搜索表。它通常运作良好。但是,在某些情况下它失败了。

例如;当我搜索' "red*" NEAR "color*" ' 时,它可以正常工作。

但是,如果我搜索 '"the*" NEAR "red*"' 它会失败。它不适用于以the 开头的任何术语

-- working case
SELECT *
FROM MyTable
WHERE CONTAINS(MyColumn, ' "red*" NEAR "color*" ')

-- failed case
SELECT *
FROM MyTable
WHERE CONTAINS(MyColumn, ' "the*" NEAR "red*" ')

有人知道为什么吗?

【问题讨论】:

  • 除非我记错了,否则很确定 'the' 被归类为“干扰词”。

标签: sql sql-server full-text-search


【解决方案1】:

“The”在全文索引中是一个停用词(或“干扰词”)。这意味着该词不会被索引,也不能使用CONTAINS 进行搜索。这可以在文档Configure and Manage Stopwords and Stoplists for Full-Text Search的开头讨论:

为了防止全文索引变得臃肿,SQL Server 有一个 丢弃无用的常见字符串的机制 搜索。这些丢弃的字符串称为停用词。索引期间 创建时,全文引擎会从全文中省略停用词 指数。这意味着全文查询不会搜索停用词。

停用词。停用词可以是在特定语言中具有含义的词。例如,在英语中,诸如“a”之类的词 "and," "is," 和 "the" 被排除在全文索引之外,因为它们 已知对搜索无用。 停用词也可以是标记 没有语言意义。

添加了重点。

如果答案是可信的,您可以从全文索引中删除停止列表,然后创建一个,如 this answer on DBA 中所述,我在以下示例中进行了示例:

ALTER FULLTEXT INDEX ON dbo.MyTable SET STOPLIST = OFF;

CREATE FULLTEXT STOPLIST NoTheStopList;

ALTER FULLTEXT STOPLIST NoTheStopList ADD 'are' LANGUAGE 'British';
ALTER FULLTEXT STOPLIST NoTheStopList ADD 'a' LANGUAGE 'British';
ALTER FULLTEXT STOPLIST NoTheStopList ADD 'is' LANGUAGE 'British';
ALTER FULLTEXT STOPLIST NoTheStopList ADD 'and' LANGUAGE 'British';
...

ALTER FULLTEXT INDEX ON dbo.MyTable SET STOPLIST = NoTheStopList;

【讨论】:

    【解决方案2】:

    您正在体验的是全文搜索中的停用词(又名干扰词)的概念。大多数全文搜索引擎都有一个非常常见的词列表,这些词在搜索中被收录,因为它们不够具体,无法被认为是相关的。

    在 SQL Server 中,您可以使用此查询显示已配置的英语停用词列表(我敢打赌 'the' 是该列表的一部分):

    select * from sys.fulltext_stopwords where language_id = 1033
    

    您可以通过creating a custom list管理停用词。

    也可以禁用停用词,但我不建议这样做:

    alter fulltext index on mytable set stoplist = off
    

    【讨论】:

    • 停用词中没有记录。
    猜你喜欢
    • 2013-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多