簡體   English   中英

帶有數字和點的T-SQL CONTAINS(。)

[英]T-SQL CONTAINS with numbers and dots (.)

我們來考慮User.Note ='Version:3.7.21.1'

SELECT * FROM [USER] WHERE CONTAINS(NOTE, '"3.7.2*"')

=>返回一些東西

SELECT * FROM [USER] WHERE CONTAINS(NOTE, '"3.7*"')

=> 什么都不返回

如果User.Note ='Version:3.7.21'

SELECT * FROM [USER] WHERE CONTAINS(NOTE, '"3.7*"')

=>返回一些東西

如果User.Note ='Version:3.72.21'

SELECT * FROM [USER] WHERE CONTAINS(NOTE, '"3.7*"')

=> 什么都不返回

我無法弄清楚它是如何工作的。 當我搜索“3.7 *”時,它應該總是返回一些東西。

你知道這背后的邏輯是什么嗎?

PS:如果我用字母替換數字,那就沒問題了。

我認為你的問題是由於斷字符與數據中的標點符號相互作用的不可預測性造成的。 全文搜索基於字符串的概念,不包括空格和標點符號。 當引擎構建索引時,它會看到句點並以奇怪的方式打破這個詞。

舉個例子,我用你提供的三個值做了一個小桌子......

VALUES (1,'3.7.21.1'),(2,'3.7.21'),(3,'3.72.21')

現在當我做你的選擇時,我得到所有四個的結果...不是我期望的結果。

對我來說,這將返回所有三個值

SELECT * FROM containstext WHERE CONTAINS(secondid, '"3.7.2*"')

這只返回3.7.21

SELECT * FROM containstext WHERE CONTAINS(secondid, '"3.7*"')

所以讓我們運行它並查看全文索引的內容

SELECT * FROM sys.dm_fts_index_keywords(db_id('{databasename}'), object_id('{tablename}'))

對於我的結果(你的結果可能不同)我有以下display_term值

display_term     document_count
    21              3
    3               3
    3.7.21          1
    7               2
    72              1

那么讓我們看看第一個搜索標准'"3.7.2*"'如果我把它推到sys.dm_fts_parser ......

select * from sys.dm_fts_parser('"3.7.2*"', 1033, NULL, 0)

......它告訴我它正在打破比賽

3
7
2

但如果我這樣做......

select * from sys.dm_fts_parser('"3.7*"', 1033, NULL, 0)

我在術語3.7上得到了一個完全匹配, sys.dm_fts_index_keywords早些時候告訴我,我只有一個包含3.7文檔/行

您可能還會遇到額外的怪異,因為數字0-9通常位於系統停用詞中,並且可能被排除在索引之外,因為它們被認為是無用的。 這可能是您更改為字母時的原因。

此外,我知道您已決定替換LIKE,但Microsoft 建議您僅在全文索引中使用字母數字字符,如果您需要在搜索條件中使用非字母數字字符,則應使用LIKE。 也許將句號更改為某些不會在正常值中使用的字母數字替換?

僅當列位於全文索引中時,包含才有效。 如果它沒有編入索引,你將需要使用如下:

SELECT * FROM [USER] WHERE NOTE like '3.7%' --or '%3.7%

你想使用CONTAINS是因為你覺得它會更快嗎?(一般來說)

Microsoft文檔列出了可以格式化和使用CONTAINS的所有方法(11個示例)

這是關於CONTAINS的Microsoft文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM