2015-11-20 64 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开始。