我有一个搜索引擎,可以动态地为SQL Server数据库构建查询,我对这些查询的结果不同:
CONTAINS('goal AND of AND Chelsea');
AND
CONTAINS('goal') AND CONTAINS('of') AND CONTAINS('Chelsea')
第一个返回结果,第二个没有。
我将这些命令用于全文搜索引擎接受噪音词:
sp_configure 'show advanced options', 1
RECONFIGURE
GO
sp_configure 'transform noise words', 1
RECONFIGURE
GO
现在,第一个sql命令工作正常,但第二个,即我的搜索引擎生成的命令,不起作用。
答案 0 :(得分:2)
"的"是一个噪音词。
我可以使用"转换干扰词"来重现您的结果。 on并将以下内容插入到全文索引表中
INSERT INTO [dbo].[testtable]
([id],
[text])
VALUES (1,'goal'),
(2,'Chelsea'),
(3,'of'),
(4,'Drogba of Chelsea scored a goal')
填充索引后
SELECT *
FROM sys.dm_fts_index_keywords(db_id('fts'), object_id('testtable'))
返回
+--------------------------------+--------------+-----------+----------------+
| keyword | display_term | column_id | document_count |
+--------------------------------+--------------+-----------+----------------+
| 0x006300680065006C007300650061 | chelsea | 2 | 2 |
| 0x00640072006F006700620061 | drogba | 2 | 1 |
| 0x0067006F0061006C | goal | 2 | 2 |
| 0x00730063006F007200650064 | scored | 2 | 1 |
| 0xFF | END OF FILE | 2 | 4 |
+--------------------------------+--------------+-----------+----------------+
我从中得出结论,此选项不会影响索引的内容 - 只是如何处理查询。
CONTAINS('goal AND of AND Chelsea');
成为
CONTAINS('goal AND Chelsea');
忽略噪音词后。
CONTAINS('of')
无法从索引中回答,并且SQL Server明确地决定返回false
比返回true
更好地返回不包含该文本的事件的行。
我不确定为什么它不会评估为unknown
而不是false
但
WHERE NOT CONTAINS([text],'of')
返回所有行 - 包括那些包含术语!
的行
如果您无法改变查询以使用符合您需要的模式,那么您需要通过在全文索引中包含干扰词来解决问题。
运行后
ALTER FULLTEXT INDEX ON [dbo].[testtable] SET STOPLIST = OFF
并重建索引,它按照你想要的方式工作。