【问题标题】:BRAVO value won't be found after a SQL SELECT CONTAINS在 SQL SELECT CONTAINS 之后找不到 BRAVO 值
【发布时间】:2021-05-12 08:29:50
【问题描述】:

我在 sql server 上有一个非常奇怪的行为。

我有一个用户表,其中一行的姓氏是 BRAVO。

当我使用这个简单的请求时:

select * from User u where contains (u.LastName, 'BRAVO')

它没有找到任何结果。 如果我更新用户表并将姓氏 BRAVO 设置为 CRAVO(或任何其他字母)并调用

select * from User u where contains (u.LastName, 'CRAVO')

它会起作用的。

BRAVO 是 SQL Server 中的保留字吗?我错过了什么吗?

谢谢

【问题讨论】:

  • 查看它是否出现在默认停止列表中SELECT * FROM sys.fulltext_system_stopwords WHERE language_id = 1033;
  • 天啊,就是这样,谢谢!
  • Full-Text Search: "全文查询通过基于特定语言规则对单词和短语进行操作,对全文索引中的文本数据执行语言搜索。 ..” - 我强烈建议不要尝试将它们用于非语言内容。

标签: sql-server contains


【解决方案1】:

默认情况下,当您创建全文索引时,它与系统停止列表相关联。默认停止列表有超过 150 个英语单词。您可以运行下面的查询并查看特定数据库的所有英语停止词。

 SELECT stopword,language_id FROM sys.fulltext_system_stopwords WHERE language_id = 1033

什么是停止清单? :

数据库中的停用词使用称为停用词表的对象进行管理。停用词列表是停用词列表,当与全文索引关联时,将应用于该索引上的全文查询。

什么是停用词? :

为防止全文索引变得臃肿,SQL Server 有一种机制可以丢弃不利于搜索的常见字符串。这些丢弃的字符串称为停用词。在创建索引期间,全文引擎会忽略全文索引中的停用词。

您可以使用以下查询来查找系统指定的英语停用词:

SELECT ssw.stopword, slg.name
      FROM sys.fulltext_system_stopwords ssw
      JOIN sys.fulltext_languages slg
      ON slg.lcid = ssw.language_id
      WHERE slg.lcid =1033

因此,如果您在全文搜索中包含这些字词,包括 BRAVO(对于完全匹配,在双引号中给出匹配)不会给您确切的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2023-02-21
    • 2015-11-02
    相关资源
    最近更新 更多