簡體   English   中英

SQL-Server 全文索引意外結果

[英]SQL-Server Full Text Index Unexpected results

MS SQL SERVER 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 不包含下划線。

SQL Server 有一個被認為是干擾的單詞和符號列表,這些被排除在索引之外,你不能專門搜索它。 您可以編輯此列表,也可以創建一個新列表。 請參閱此處了解操作方法。

顯然,您甚至可以在文件級別對其進行編輯,請參見此處

編輯:

我已經能夠重現這個問題:

create table TestFullTextSearch (
Id int not null,
AllText nvarchar(400)
)

create unique index test_tfts on TestFullTextSearch(Id);
create fulltext catalog ftcat_tfts;
create fulltext index on TestFullTextSearch(AllText)
key index test_tfts on ftcat_tfts
with change_tracking auto, stoplist off
go

insert into TestFullTextSearch values (1, 'legacyreport Report Legacy 23049823490  20150713 Cardiac US ')
insert into TestFullTextSearch values (2, '123-45-678 foo bar  19450712 20020723 Exercise Stress US ')
insert into TestFullTextSearch values (3, '2048 jj goodguy xy2000 19490328 20150721 Cardiac US ')
insert into TestFullTextSearch values (4, '12345678 4.0 ALLCALCS  19650409 20031103 Cardiac Difficult US ')
insert into TestFullTextSearch values (5, 'Veterinary Products Beaphar Fiprotec Spot On Small Dog 67mg x 1 235_ldzr_2 Beaphar 87112311437_ldzr_2 ')

在這張桌子上,如果我執行

select * 
from   TestFullTextSearch 
where  contains(AllText, '"235_ldzr_2*"')

我沒有結果。 但是,如果我添加反斜杠:

select  * 
FROM    TestFullTextSearch 
WHERE   CONTAINS(AllText, '"235\_ldzr_2*"')

我確實得到了結果!

雖然我不明白。 如果我添加另一行:

insert into TestFullTextSearch values (6, 'Veterinary Products Beaphar Fiprotec Spot On Small Dog 67_mg x 1 235_ldzr_2 Beaphar 87112311437_ldzr_2 ')

我搜索WHERE CONTAINS(AllText, '"67_*"') ,我得到了預期的結果......其他測試也是如此,不顯示與contains(AllText, '"235_ldzr_2*"')相同的行為contains(AllText, '"235_ldzr_2*"')

順便說一下,我的 LCID = 1033。

再一個測試用例:

Insert into TestFullTextSearch values (15, 'Veterinary Products Beaphar Fiprotec Spot On Small Dog 100_ldzr_2 x 1 225_ldzr_2 Beaphar 87112311437_ldzr_2 ')

我可以找到的這張唱片

CONTAINS(AllText, '"100_*"')

但是,這個記錄,我在100_ldzr前面添加了x 1

Insert into TestFullTextSearch values (16, 'Veterinary Products Beaphar Fiprotec Spot On Small Dog x 1 100_ldzr_2 x 1 225_ldzr_2 Beaphar 87112311437_ldzr_2 ')

我找不到相同的CONTAINS ,但如果我添加反斜杠,我可以找到它。

結論(暫時)

當數字后跟一個空格,然后后跟以下划線結尾的數字時,似乎可能會出現問題。 考慮以下:

select * from sys.dm_fts_parser('"x 235_*"', 1033, 0, 0)

這會產生 2 個搜索詞:“x”和“235_”

然而這:

select * from sys.dm_fts_parser('"1 235_*"', 1033, 0, 0)

結果是七個搜索詞:“1 235”、“1235”、“1”、“235”和“_”。 (1 和 235 也作為 nn1/nn235 出現)。

“235_”的缺失解釋了為什么找不到它。 當我添加反斜杠時,它被解釋為單詞分隔符,將235\\_匹配到235 (和_ )。

我非常有信心這就是原因。 解決方案可能更困難。

暫無
暫無

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

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