许多CONTAINS和只有一个有什么区别?

时间:2015-07-15 19:13:17

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

我有一个搜索引擎,可以动态地为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命令工作正常,但第二个,即我的搜索引擎生成的命令,不起作用。

1 个答案:

答案 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')

返回所有行 - 包括那些包含术语!

的行

enter image description here

如果您无法改变查询以使用符合您需要的模式,那么您需要通过在全文索引中包含干扰词来解决问题。

运行后

ALTER FULLTEXT INDEX ON [dbo].[testtable] SET STOPLIST = OFF

并重建索引,它按照你想要的方式工作。