【发布时间】:2018-02-15 00:43:47
【问题描述】:
MS SQL 服务器 2012
我在数据库上配置了一个全文索引,该索引的主要部分似乎运行正常。我有一个包含以下文本的关键字字段:
Veterinary Products Beaphar Fiprotec Spot On Small Dog 67mg x 1 235_ldzr_2 Beaphar 87112311437_ldzr_2
当尝试选择行时,我得到了意想不到的结果
select * from products where CONTAINS(keywords,'"235*"')
select * from products where CONTAINS(keywords,'"87112311437_ldzr_2*"')
两者都返回预期的结果。这告诉我索引已设置并且下划线字符不是问题。但是我没有得到任何结果:
select * from products where CONTAINS(keywords,'"235_*"')
select * from products where CONTAINS(keywords,'"235_ldzr_2*"')
我打开了自动更改跟踪,并禁用了它,手动重建索引,重新启用它,但仍然没有运气。我什至已经到了逐个字符评估字符串以获取 ascii 代码的地步,以防特殊字符通过导入进入。该术语不会出现在停止列表中。我现在不知道为什么这个项目没有显示。
我在单独的数据库中创建了一个副本,但无法重现问题,因此无法在此处真正发布代码 - 因为我无法显示错误。
是否有任何人可以进行任何进一步的检查或知道影响全文搜索功能的任何其他点?
@HoneyBadger 我已经缩小了范围。数字后跟带下划线的数字似乎存在问题。在您的表结构上尝试以下操作。
DELETE FROM TestFullTextSearch
insert into TestFullTextSearch values (1, '235_ldzr_2 testing ')
insert into TestFullTextSearch values (2, 'test 235_ldzr_2 testing ')
insert into TestFullTextSearch values (3, 'A 235_ldzr_2 testing ')
insert into TestFullTextSearch values (4, '1 235_ldzr_2 testing ')
insert into TestFullTextSearch values (5, '12 235_ldzr_2 testing ')
insert into TestFullTextSearch values (6, '123 235_ldzr_2 testing ')
SELECT *
from TestFullTextSearch
where contains(AllText, '"235*"')
SELECT *
from TestFullTextSearch
where contains(AllText, '"235_*"')
第 1、2、3 行都按预期返回。 4,5,6 不包含下划线。
【问题讨论】:
-
某些语言解析器将 _ 视为分隔符,因此无法按字面意思进行搜索。 1) 运行
select lcid from sys.syslanguages where langid=@@langid以获取您的数据库语言的 LCID 2) 运行select * from sys.dm_fts_parser('"235_*"', your-lcid-here, 0, 0);这将向您展示如何解析字符串(包括目录停止列表) -
嗨,亚历克斯。好电话-但已经走上了这条路。下划线被正确解析。我什至在该单个字段中有多个下划线实例,其中一个可以搜索,其中一个不能。很高兴看到我们的想法相同。
-
我得出了与数字有关的相同结论,请参阅我的上次编辑。
标签: sql-server full-text-search