首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >全文搜索ContainsTable中的通配符

全文搜索ContainsTable中的通配符
EN

Stack Overflow用户
提问于 2015-11-20 04:29:47
回答 2查看 3.3K关注 0票数 4

我有一个问题,在容器中"blah“和"blah*”有什么不同?下面是我的背景。

代码语言:javascript
运行
复制
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条记录。

代码语言:javascript
运行
复制
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条记录。

代码语言:javascript
运行
复制
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对关键词进行分析,两者没有任何区别。我搜索它,但我仍然找不到正确的答案。

代码语言:javascript
运行
复制
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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-20 05:01:25

FTS中的Star(*)用于通配符,与普通查询的概念相同。

因此,当您搜索blah时,它会搜索blah附带的单词。当您使用blah*时,它会搜索以blah开头的单词,不管之后写的是什么。

如果你用*blah搜索,它会搜索结束词blah的位置。

现在,您的问题是为什么blahBlahBlah条目不是第一次搜索,根据msdn,原因不是这些:(意思是只搜索已知单词的简单术语,而不是我们创建的任何单词)

包含可以搜索: 单词或短语。一个词或短语的前缀。一个接近另一个词的词。一个词是从另一个词产生的(例如,单词驱动器是驱动器、驱动器、驱动和驱动的拐弯抹角)。使用同义词库的另一个词的同义词(例如,“金属”一词可以有“铝”和“钢”等同义词)。

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

如何引导通配符全文搜索在Server中工作?

票数 2
EN

Stack Overflow用户

发布于 2015-11-20 05:01:38

如果使用sys.dm_fts_index_keywords查看索引的内容列表

代码语言:javascript
运行
复制
SELECT display_term, column_id, document_count
FROM sys.dm_fts_index_keywords(DB_ID('DatabaseName'), OBJECT_ID('testWildcard'))

你会看到еркуу的话:废话,废话,大胆。

这意味着在创建全文索引时,空格、<>“打断”了一个单词。

现在,当您按"blah“进行搜索时,CONTAINS只返回包含单词blah的字符串。

当您添加通配符*时,通过"blah*“CONTAINS搜索返回所有包含单词的字符串,从blah开始。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33819013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档