T-SQL CONTAINS 包含数字和点 (.)

Cel*_*neR 4 sql t-sql sql-server full-text-search contains

让我们考虑User.Note = 'Version:3.7.21.1'

SELECT * FROM [USER] WHERE CONTAINS(NOTE, '"3.7.2*"')
Run Code Online (Sandbox Code Playgroud)

=> 返回一些东西

SELECT * FROM [USER] WHERE CONTAINS(NOTE, '"3.7*"')
Run Code Online (Sandbox Code Playgroud)

=> 不返回任何内容

如果User.Note = '版本:3.7.21'

SELECT * FROM [USER] WHERE CONTAINS(NOTE, '"3.7*"')
Run Code Online (Sandbox Code Playgroud)

=> 返回一些东西

如果User.Note = '版本:3.72.21'

SELECT * FROM [USER] WHERE CONTAINS(NOTE, '"3.7*"')
Run Code Online (Sandbox Code Playgroud)

=> 不返回任何内容

我不明白它是如何工作的。当我搜索“3.7*”时,它应该总是返回一些内容。

你知道这背后的逻辑是什么吗?

PS:如果我把数字换成字母就没有问题了。

小智 5

我认为您的问题是由分词器与数据中的标点符号交互的不可预测性引起的。全文搜索基于字符串的概念,不包括空格和标点符号。当引擎构建索引时,它会看到句点并以奇怪的方式打破单词。

例如,我用您提供的三个值制作了一个小表......

VALUES (1,'3.7.21.1'),(2,'3.7.21'),(3,'3.72.21')
Run Code Online (Sandbox Code Playgroud)

现在,当我做你的选择时,我得到了所有四个结果......但不是我期望的结果。

对我来说,这会返回所有三个值

SELECT * FROM containstext WHERE CONTAINS(secondid, '"3.7.2*"')
Run Code Online (Sandbox Code Playgroud)

这仅返回3.7.21

SELECT * FROM containstext WHERE CONTAINS(secondid, '"3.7*"')
Run Code Online (Sandbox Code Playgroud)

那么让我们运行一下,看看全文索引的内容

SELECT * FROM sys.dm_fts_index_keywords(db_id('{databasename}'), object_id('{tablename}'))
Run Code Online (Sandbox Code Playgroud)

对于我的结果(你的结果很可能不同),我有以下 display_term 值

display_term     document_count
    21              3
    3               3
    3.7.21          1
    7               2
    72              1
Run Code Online (Sandbox Code Playgroud)

那么让我们看看第一个搜索条件'"3.7.2*"' 如果我将其推入sys.dm_fts_parser......

select * from sys.dm_fts_parser('"3.7.2*"', 1033, NULL, 0)
Run Code Online (Sandbox Code Playgroud)

...它向我表明它正在与比赛中断

3
7
2
Run Code Online (Sandbox Code Playgroud)

但如果我这样做...

select * from sys.dm_fts_parser('"3.7*"', 1033, NULL, 0)
Run Code Online (Sandbox Code Playgroud)

我在该术语上得到了一个完全匹配3.7,并sys.dm_fts_index_keywords早些时候告诉我,我只有一个文档/行包含3.7

您可能还会遇到其他奇怪的情况,因为数字 0-9 通常在系统停用词中,并且可以从索引中删除,因为它们被认为是无用的。这可能就是当您更改为字母时它会起作用的原因。

另外,我知道您已决定替换 LIKE,但 Microsoft建议您仅在全文索引中使用字母数字字符,如果您需要在搜索条件中使用非字母数字字符,则应使用 LIKE。也许将句点更改为某些在正常值中不会使用的字母数字替换?