2015-11-20 61 views
3

我有一個問題包容性表達式中的「blah」和「blah *」有什麼不同?下面是 是我的上下文。包含表中的通配符全文搜索

create table testWildcard(pk int identity constraint twpk primary key, displayName varchar(100)) 
GO 
create fulltext catalog test12 as default 
GO 
create fulltext index on testWildcard(displayName) key index twpk 
GO 
insert into testWildcard(displayName) values('blahBlahBlah') 
insert into testWildcard(displayName) values('blah<bold>Blah</bold>Blah') 
insert into testWildcard(displayName) values('blah Blah Blah') 
GO 

當使用「blah *」作爲關鍵字進行搜索時,結果爲3條記錄。

select * from testWildcard t 
inner join CONTAINSTABLE(testWildcard, *, '"blah*"', LANGUAGE 1033) as w on t.pk=w.[Key] 

    results: 
      pk displayName     Key RANK 
      1 blahBlahBlah     1 16 
      2 blah<bold>Blah</bold>Blah 2 48 
      3 blah Blah Blah    3 48 

當使用「blah」作爲關鍵字進行搜索時,結果爲2條記錄。

select * from testWildcard t 
inner join CONTAINSTABLE(testWildcard, *, '"blah"', LANGUAGE 1033) as w on t.pk=w.[Key] 

resuts: 
      pk displayName     Key RANK 
      2 blah<bold>Blah</bold>Blah 2 48 
      3 blah Blah Blah    3 48 

然後我用系統函數sys.dm_fts_parser來分析關鍵字,它們沒有任何區別。我谷歌,但我仍然無法找到正確的答案。

SELECT * FROM sys.dm_fts_parser ('"blah"', 1033, 0, 0) 
SELECT * FROM sys.dm_fts_parser ('"blah*"', 1033, 0, 0) 
result: 
keyword    group_id phrase_id occurrence special_term display_term expansion_type source_term 
0x0062006C00610068 1   0   1   Exact Match  blah  0    blah 

謝謝。

回答

2

FTS中的星號(*)用於與通常查詢相同的概念。

所以,當你搜索blah,它搜索詞來自blah。 當您使用blah*時,它會搜索以blah開頭的單詞,然後再寫入。

如果您使用*blah進行搜索,它會搜索結尾詞blah

現在你的問題是,爲什麼blahBlahBlah條目不是誰先搜索,之所以按照msdn它不是任何這樣的:(指FTS只搜索這是衆所周知的。簡單一句話,沒有任何一句話,我們創建)

CONTAINS可以搜索:

A word or phrase. 

The prefix of a word or phrase. 

A word near another word. 

A word inflectionally generated from another (for example, the word drive is the inflectional stem of drives, drove, driving, and driven). 

A word that is a synonym of another word using a thesaurus (for example, the word "metal" can have synonyms such as "aluminum" and "steel"). 

https://technet.microsoft.com/en-us/library/cc879300%28v=sql.105%29.aspx

How do you get leading wildcard full-text searches to work in SQL Server?

0

如果您在使用sys.dm_fts_index_keywords

SELECT display_term, column_id, document_count 
FROM sys.dm_fts_index_keywords(DB_ID('DatabaseName'), OBJECT_ID('testWildcard')) 

你會看到еркуу詞在索引的內容的列表中查找:胡說,blahblahblah,大膽​​。

這意味着當創建全文索引時,空間<>「打破」了一個詞。

現在,當您通過「blah」搜索CONTAINS時,只返回僅包含字blah的字符串。
而且當你添加通配符*,所以搜索「b​​lah *」CONTAINS返回所有包含單詞的字符串,從blah開始。