簡體   English   中英

SQL Server中全文搜索的奇怪行為

[英]Strange behaviour with Fulltext search in SQL Server

我有帶有列消息NVARCHAR(MAX)的MyTable。

ID為1的記錄包含消息“ 0123456789333444測試”

當我運行以下查詢

DECLARE @Keyword NVARCHAR(100)

SET @Keyword = '0123456789000001*'

SELECT *
FROM MyTable
WHERE CONTAINS(Message, @Keyword) 

記錄ID 1顯示在結果中,我認為不應,因為0123456789333444不包含0123456789000001。

有人可以解釋為什么仍然顯示記錄嗎?

編輯

select * from sys.dm_fts_parser('"0123456789333444 Test"',1033,0,0)

返回以下內容:

group_id phrase_id occurrence special_term  display_term        expansion_type source_term
1        0         1           Exact Match  0123456789333444    0              0123456789333444 Test
1        0         1           Exact Match  nn0123456789333444  0              0123456789333444 Test
1        0         2           Exact Match  test                0              0123456789333444 Test

這是因為@Keyword沒有用雙引號引起來。 強制零個,一個或多個匹配。

指定以指定文本開頭的單詞或短語的匹配項。 將前綴術語用雙引號(“”)括起來,並在結束引號之前添加星號( ),以便匹配所有以星號之前指定的簡單術語開頭的文本。 該子句的指定方式應為:CONTAINS(列,“文本 ”)。 星號匹配零個,一個或多個字符(詞根或短語中的一個或多個根詞)。 如果文本和星號沒有用雙引號引起來,則謂詞為CONTAINS(列,“文本*”),則全文搜索會將星號視為字符,並搜索與文本*的完全匹配項。 全文引擎將找不到帶星號(*)的單詞,因為分詞系統通常會忽略此類字符。

當是短語時,該短語中包含的每個單詞都被視為一個單獨的前綴。 因此,指定前綴術語“ local wine *”的查詢將與文本為“ local winery”,“ local wined and dined”等的任何行匹配。

看一下有關該主題的MSDN。 MSDN

您是否嘗試過查詢以下視圖以查看系統停止列表上的內容?

select * from sys.fulltext_system_stopwords where language_id = 1033;

找到了可行的解決方案。 我添加了language 1033作為附加參數。

SELECT * FROM MyTable WHERE CONTAINS(Message, @Keyword, langauge 1033) 

暫無
暫無

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

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