SQL Server 围绕数字和下划线进行全文搜索

2024-03-30

使用 SQL Server 2012(通常使用 SQL Server 2008 R2 到 SQL Server 2016)

这个问题是更具体的重新措辞SQL-Server 全文索引意外结果 https://stackoverflow.com/questions/48788921/sql-server-full-text-index-unexpected-results?noredirect=1#comment84585533_48788921。请参阅此处了解我们是如何走到这一步以及已经尝试过什么。

我现在重新发布,我们已经找到了具体的错误。非常感谢@蜜獾 https://stackoverflow.com/users/1587819/honeybadger.

走到这一步,他的帮助是无价的。

表结构:

CREATE TABLE TestFullTextSearch (Id INT NOT NULL, AllText NVARCHAR(400))

CREATE UNIQUE INDEX test_tfts ON TestFullTextSearch(Id)

CREATE FULLTEXT CATALOG ftcat_tfts

CREATE FULLTEXT INDEX ON TestFullTextSearch(AllText)
    KEY INDEX test_tfts ON ftcat_tfts
    WITH CHANGE_TRACKING AUTO, STOPLIST OFF

Data:

INSERT INTO TestFullTextSearch 
VALUES (1, ' 123_456 789 '), (2, ' 789 123_456 '),
       (3, ' 123_456 ABC '), (4, ' ABC 123_456 ')

请注意,此数据纯粹是为了演示该问题,并不表示实时数据集。我们的实时数据集可能超过 500,000 行,并且搜索单个字段中的数据段落 - 因此使用全文搜索。

选择1:结果符合预期

SELECT *
FROM TestFullTextSearch
WHERE CONTAINS (AllText, '"123*"')

Id          AllText
----------- ------------
1            123_456 789
2            789 123_456
3            123_456 ABC
4            ABC 123_456

选择 2:错过结果集中的第 2 行

SELECT *
FROM TestFullTextSearch
WHERE CONTAINS (AllText, '"123_*"')

Id          AllText
----------- ------------
1            123_456 789
3            123_456 ABC
4            ABC 123_456

选择 3:只返回第2行

SELECT *
FROM TestFullTextSearch
WHERE CONTAINS (AllText, '"123\_*"')

Id          AllText
----------- ------------
2            789 123_456

结论:如果前面的单词是数字字符串,则搜索以下划线后缀的数字字符串将失败。

Problem:我们的客户使用全文搜索,并期望围绕零件编号和目录参考提供结果,这些结果可能会或可能不会出现在包含其他数字字符串的文本部分中。全文搜索似乎并没有以一致的方式支持这一点。

非常感谢任何帮助。

注意:此问题不会发生在 SQL SERVER 2008 上,但会发生在 2012+ 上

我也尝试过切换到旧版本的 FTS 解析器。测试用

SELECT * FROM sys.dm_fts_parser (' "789 123_456" ',1033,0,0)
SELECT * FROM sys.dm_fts_parser (' "789 123_456" ',2057,0,0)

I had with current parser: enter image description here

And after reverting to the legacy parser: enter image description here

所以它已经产生了效果,但我仍然得到相同的结果。

2008 年和 2012 年之间的全文搜索是否存在任何其他差异可能会产生这种影响?


他们更改了 SQL 2008 和 SQL 2012 之间的全文解析器/词干分析器。

通过更改注册表,您可以使用旧的解析器,它应该更适合您的情况。

See https://technet.microsoft.com/en-us/library/gg509108(v=sql.110).aspx https://technet.microsoft.com/en-us/library/gg509108(v=sql.110).aspx了解详情。

如果您需要同时支持新旧风格,那么您可以将美国英语恢复为旧风格,并保留英国英语为新风格(反之亦然)

使用 SQL 2016,我恢复了英国英语并保持美国英语相同:

exec sp_help_fulltext_system_components 'wordbreaker', 1033

exec sp_help_fulltext_system_components 'wordbreaker', 2057

Returns: Screenshot showing fts components

我使用英国英语创建了另一个表并填充了它。

CREATE TABLE TestFullTextSearch2 (Id INT NOT NULL, AllText NVARCHAR(400))

CREATE UNIQUE INDEX test_tfts2 ON TestFullTextSearch2(Id)


CREATE FULLTEXT INDEX ON TestFullTextSearch2(AllText language 2057)
    KEY INDEX test_tfts2 ON ftcat_tfts 
    WITH CHANGE_TRACKING AUTO, STOPLIST OFF

    INSERT INTO TestFullTextSearch2
VALUES (1, ' 123_456 789 '), (2, ' 789 123_456 '),
       (3, ' 123_456 ABC '), (4, ' ABC 123_456 ')

我得到了所有 3 个查询的预期 4 个结果。

验证您的更改是否已生效。

exec sp_help_fulltext_system_components 'wordbreaker', 1033

exec sp_help_fulltext_system_components 'wordbreaker', 2057

select t.name, c.* from sys.tables t inner join sys.fulltext_index_columns c on t.object_id = c.object_id
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 围绕数字和下划线进行全文搜索 的相关文章

  • H2 SQL 日期比较

    在 H2 数据库中 如何在 TIMESTAMP 类型的列上运行查询 SELECT FROM RECORDS WHERE TRAN DATE lt 2012 07 24 Try 2012 07 24
  • Entity Framework 6(代码优先)实体版本控制和审计

    我正在考虑将 Entity Framework 6 1 1 与 SQL Server 2008 R2 一起使用 目前 我正在使用代码优先的 EF 功能创建模型和数据库 我的基本用例是创建一个特定实体的所有更改的日志 ID是关键栏 以帮助审核
  • 如何用约束标记一大组“传递群”?

    在 NealB解决方案之后进行编辑 与以下解决方案相比 NealB的解决方案非常非常快任何另一个 https stackoverflow com q 18033115 answers and 提出了关于 添加约束以提高性能 的新问题 Nea
  • 如何拥有引用另一个表的检查约束?

    我在 SQL Server 2008 数据库中有以下表 tblItem 其中有一个ItemID field 好项目 它还有一个 ItemID 字段 并且有一个指向 tblItem 的外键 tblBadItem 它也有一个 ItemID 字段
  • Oracle Text:如何清理用户输入

    如果有人有使用 Oracle 文本的经验 CTXSYS CONTEXT 我想知道当用户想要搜索可能包含撇号的名称时如何处理用户输入 在某些情况下 转义 似乎有效 但对于单词末尾的 s 则不起作用 s 在停用词列表中 因此似乎已被删除 目前
  • 为什么我的代码会产生错误:该语句没有返回结果集[重复]

    这个问题在这里已经有答案了 我正在从 Microsoft SQL Server Studio 执行以下查询 该查询工作正常并显示结果 SELECT INTO temp table FROM md criteria join WHERE us
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • MySQL 可选的带有 MATCH 的 LEFT JOIN

    我有以下查询 它对 MySQL Innodb 数据库中同一搜索词的两个不同表中的两列执行全文搜索 SELECT Id MATCH tb1 comment tb2 comment AGAINST search term IN BOOLEAN
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • ORA-12728: 正则表达式中的范围无效

    我想检查表中是否插入了有效的电话号码 所以我的触发代码在这里 select start index into mob index from gmarg mobile operators where START INDEX substr ne
  • Microsoft SQL:CASE WHEN 与 ISNULL/NULLIF

    除了可读性之外 在防止 SQL 中的除以 0 错误时 使用 CASE WHEN 语句与 ISNULL NULLIF 相比还有什么显着的好处吗 CASE WHEN BeginningQuantity BAdjustedQuantity 0 T
  • 如何使用一个命令删除 SQL 数据库中的所有索引?

    那么 如何通过一条命令删除 SQL 数据库中的所有索引呢 我有这个命令可以获取所有 20 个左右的 drop 语句 但是如何从这个 结果集 运行所有这些 drop 语句呢 select from vw drop idnex 给我相同列表的另
  • 无法与重定向器建立连接。确保“sql browser”服务正在运行

    所以我尝试这个 sql server 2012 由于这个错误我无法打开任何 ssis 包 无法与重定向器建立连接 确保 sql browser 服务正在运行 我的 Sql 浏览器肯定正在运行 我尝试在本地服务 本地系统和网络下更改它 仍然没
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 更改表添加列并在同一条件 IF 语句中更新新列

    我正在尝试添加列并在同一 if 语句中更新它 BEGIN TRAN IF NOT EXISTS SELECT 1 FROM sys columns WHERE Name N Code AND Object ID Object ID N Te
  • SQL Server 中离线索引重建和在线索引重建有什么区别?

    重建索引时 有一个选项ONLINE OFF and ONLINE ON 我知道当ONLINE模式打开时 它会复制索引 切换新查询以利用它 然后重建原始索引 使用版本控制跟踪两者的更改 如果我错了 请纠正我 但是 SQL 在离线模式下会做什么
  • SQL服务器超时

    我的应用程序是在经典 asp 上开发的 但也使用 asp net 因为我正在将应用程序迁移到 Net 上 它使用 SQL Server 作为数据库并托管在 Windows Server 2003 上 现在的问题是应用程序在很长一段时间内继续
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 需要在 SQL Server 中透视字符串值

    我有一个包含值的表 描述为 Occupation String Name String Developer A Developer B Designer X Coder Y Coder Z 我需要数据透视格式的值 Designer Deve

随机推荐

  • 计算出的字体大小大于 Asus Nexus 7 上 CSS 中定义的字体大小

    我在 Asus Nexus 7 用 jQuery Mobile 编写 上运行该网页 我在 CSS 中将字体大小设置为 14px 但在调试过程中 在 PC 上使用 Chrome 我可以看到它的计算大小是 22px HTML 代码如下所示 di
  • Kubernetes 和 AWS:设置 LoadBalancer 以使用预定义的安全组

    正如标题所示 我正在寻找一种方法来强制 LoadBalancer 服务使用 AWS 中预定义的安全组 我不想手动编辑 Kubernetes 为 ELB 创建的安全组的入站 出站规则 我无法在文档中找到任何内容 也没有找到任何可以在网上其他地
  • 使用 jinja 的 Ansible set_fact 列表

    我正在尝试学习 jinja 和 Ansible 这是在 RHEL 7 9 上 ansible 2 9 27 ansible python module location usr lib python2 7 site packages ans
  • 同步睡眠进入 asyncio 协程

    我有一个协程如下 async def download downloader DataManager downloader download DataManager download 方法如下 def download self start
  • 使用 Mojo::IOLoop 将命令输出到套接字而不进行缓冲

    如何在Mojo服务器上以实时模式连续输出命令 对我来说是长ping 我正在寻找 Mojo IOLoop 的一些示例 例如 客户端连接到服务器并请求 ping X X X X 服务器返回非缓冲输出 而服务器上的 ping 返回每一行输出 客户
  • 如何从 TVML 文本字段获取值?

    我正在尝试弄清楚如何使用 TVJS 从 TVML 中的文本字段获取值 但我还没有找到任何相关文档 而且我不想等待文档更新 实际上没有任何绑定到输入的模式 因为我确信除了登录服务之外这是很少使用的情况 我想我可以解析 Xml 但这看起来非常老
  • 警报对话框背景颜色

    我正在使用具有自定义布局的 AlertDialog 布局中TextView的颜色为黑色 因此在Android 4 0上使用Holo Light打开对话框时 文本是可见的 但是 如果您在 Android 2 2 中打开该对话框 由于灰色背景
  • 如何在Unity中正确导入fbx?

    我已经建模了一个对象并导出为 fbx 在 Unity 中导入资源后 会出现一些伪影 这些文物似乎与 Unity 导入有关 而不是 fbx 文件 因为在 Windo3d 3d viever 中查看的模型似乎没有问题 万分感谢 Blender
  • Spark 中打开的文件太多,中止 Spark 作业

    在我的应用程序中 我正在读取 40 GB 的文本文件 这些文件完全分布在 188 个文件中 我拆分此文件并使用 rdd 对在 Spark 中每行创建 xml 文件 对于 40 GB 的输入 它将创建数百万个小 xml 文件 这是我的要求 一
  • IE 9 在悬停时重置背景位置(IE bug?)

    我不敢相信我发现了一些在 IE8 和 IE7 中都有效但在 IE9 中失败的东西 这是我正在处理的页面 网站链接 1 请注意 在 IE9 中 当悬停链接时 浏览器在侧面菜单上如何将背景重置为background position 0 0并且
  • 在 sbt 中添加仅编译时的子项目依赖项

    我有一个多项目包含一个私有宏子项目 其用途仅限于实现其他子项目的方法体 它既不应该出现在其他子项目的运行时类路径上 也不应该以任何形式在其他子项目已发布的 POM 中可见 这样其他 sbt 项目就可以在不知道宏子项目的情况下使用该项目中的库
  • Keycloak 缺少表单参数:grant_type

    我的本地计算机上有独立运行的 keycloak 我创建了名为 spring test 的新领域 然后创建了名为 login app 的新客户端 根据其余文档 POST http localhost 8080 auth realms spri
  • 如何对前 5 个有值的单元格求平均值

    我有一个类似这样的电子表格 我只想对前 5 个包含数据的单元格进行平均 我怎样才能做到这一点 随着列表获取更多数据 如下所示 我希望能够定位一个单元格 如 A10 并从该单元格返回 5 同样 只有当它里面有数据时 所以图像的公式应该是这样的
  • 邮政编码 + 国家/地区到地理坐标

    获取给定国家 地区的给定邮政编码 邮政编码的坐标 纬度 经度 的最完整 精确和可靠的方法是什么 我需要发出大量请求 因此高 API 限制率 甚至可能不存在 会很有用 GeoNames http www geonames org postal
  • 使用 movsd 让编译器复制字符

    我想在时间关键的函数中复制相对较短的内存序列 小于 1 KB 通常为 2 200 字节 CPU 端的最佳代码似乎是rep movsd 但是我不知何故无法让我的编译器生成此代码 我希望 我隐约记得看到过 使用 memcpy 可以使用编译器内置
  • 使用“严格引用”时不能使用字符串(“1”)作为子例程引用

    在对我尝试使用的各种事件做出反应的 Perl 守护进程中空对象模式 http en wikipedia org wiki Null Object pattern在 2 种情况下 通过创建匿名子例程 它应该只返回值 1 又名 true 请滚动
  • SQLAlchemy 与辅助表连接行为的关系在延迟加载和急切加载之间发生变化

    我已经使用 SQL Alchemy 几个月了 到目前为止 它给我留下了深刻的印象 我现在遇到了一个问题 这似乎是一个错误 但我不确定我是否在做正确的事情 我们在这里使用 MS SQL 通过表反射来定义表类 但是我可以使用内存 SQLite
  • maven部署到本地仓库

    有人可以告诉我如何将工件部署到本地存储库中以测试部署场景吗 问题是我们使用 nexus 作为远程存储库 我想知道是否可以使用自定义名称而不是 nexus 为我们提供的名称来部署我的工件 提前致谢 使用以下命令 mvn install ins
  • 使用正则表达式来匹配 IP 地址

    我正在尝试进行测试以检查 sys argv 输入是否与 IP 地址的正则表达式匹配 作为一个简单的测试 我有以下 import re pat re compile d 1 3 d 1 3 d 1 3 d 1 3 test pat match
  • SQL Server 围绕数字和下划线进行全文搜索

    使用 SQL Server 2012 通常使用 SQL Server 2008 R2 到 SQL Server 2016 这个问题是更具体的重新措辞SQL Server 全文索引意外结果 https stackoverflow com qu