2010-11-17 73 views
4

我有一个全文索引创建一个类型为varchar(max)的文件流启用。文件流包含诸如JPG,TIF,PDF和XML之类的数据(尽管我相信这与问题无关)。contains和containstable之间的显着差异?

我有两个我创建的查询允许我在索引上进行搜索。

全文搜索#1--

select 
     parentObj.ObjectID as 'GroupingID', 
     parentObj.Name as 'Grouping', 
     childObj.ObjectID as 'FileObjID', 
     childObj.Name as 'FileName', 
     fs.FileStreamID 
    from dbo.dat_FileStream fs 
    inner join dbo.dat_Object childObj 
     on fs.ObjectID = childObj.ObjectID 
    inner join dbo.dat_Collection c 
     on fs.ObjectID = c.ObjectID 
    inner join dbo.dat_Object parentObj 
     on c.ParentID = parentObj.ObjectID 
    where contains(FileStreamData, @srchTerm) 
     and parentObj.ObjectTypeID = 1 
    ORDER BY 'Grouping' 

全文搜索#2--

select 
     KEY_TBL.RANK, 
     parentObj.ObjectID as 'GroupingID', 
     parentObj.Name as 'Grouping', 
     childObj.ObjectID as 'FileObjID', 
     childObj.Name as 'FileName', 
     fs.FileStreamID 
    from dbo.dat_FileStream fs 
    inner join containstable(dbo.dat_FileStream, FileStreamData, @srchTerm, 1000) as KEY_TBL 
     on fs.FileStreamID = KEY_TBL.[KEY] 
    inner join dbo.dat_Object childObj 
     on fs.ObjectID = childObj.ObjectID 
    inner join dbo.dat_Collection c 
     on fs.ObjectID = c.ObjectID 
    inner join dbo.dat_Object parentObj 
     on c.ParentID = parentObj.ObjectID 
    where parentObj.ObjectTypeID = 1 
    ORDER BY 'Grouping' 

两个全文搜索之间的唯一区别显著为查询#1的用途包含和查询#2使用containstable。

我的问题是,这两个查询并不总是产生相同的结果。例如,如果我搜索短语“独立承包商”,查询#1将生成10个不同文档(PDF和XML)的结果集,而查询#2只会生成6个结果集。这似乎是规则:查询#1总是产生比查询#2更多的数据,并且查询#2总是产生与查询#1完全相同的匹配。

查询#1 - 在 “独立承包商” 产量搜索:

4262 AAA-00-12 4561 AAA-00-12.pdf 4235 
4316 AAA-00-15 4753 AAA-00-15.pdf 4427 
4316 AAA-00-15 4754 AAA-00-15.xml 4428 
3873 AAA-00-19 4784 AAA-00-19.pdf 4458 
3903 AAA-00-22 6795 AAA-00-22.pdf 6459 
3953 AAA-00-24 6899 AAA-00-24.pdf 6563 
3953 AAA-00-24 6900 AAA-00-24.xml 6564 
4842 AAA-00-9 4905 AAA-00-9.pdf 4577 
4842 AAA-00-9 4906 AAA-00-9.xml 4578 
4057 AAA-0001 4260 AAA-0001.pdf 3936 

查询#2 - “独立承包商” 产量搜索:

19 4262 AAA-00-12 4561 AAA-00-12.pdf 4235 
126 4316 AAA-00-15 4754 AAA-00-15.xml 4428 
126 4316 AAA-00-15 4753 AAA-00-15.pdf 4427 
116 3873 AAA-00-19 4784 AAA-00-19.pdf 4458 
125 3903 AAA-00-22 6795 AAA-00-22.pdf 6459 
57 3953 AAA-00-24 6900 AAA-00-24.xml 6564 
57 3953 AAA-00-24 6899 AAA-00-24.pdf 6563 

回答

3

CONTAINSTABLE

top_n_by_rank

指定仅返回排名最高的匹配项 。仅在指定了 整数值n时适用。 如果 top_n_by_rank与其他 参数组合在一起,则该查询可能会返回的行数少于实际上与所有 谓词匹配的行数 的行数少于 。

尝试运行W/O顶部,看它是否匹配CONTAINS

+0

这样做!我仍然不明白为什么top_n_by_rank返回的结果较少。我假设“与其他参数结合”意味着给含有稳定剂的其他参数。感谢您的时间和意见;我很欣赏它。 – Jagd 2010-11-17 19:36:54

+2

好的,这是我发现的。如果我搜索“承包商”一词并将top_n_by_rank设置为1000,则不返回RANK 13或更低版本中的任何结果,即使我的总结果集远远少于1000个返回的项目!**这就是我真的不到这里。如果结果集合的总数小于1000,那么不应该让我把所有东西都退还给我,无论任何项目的排名是什么? – Jagd 2010-11-17 19:50:00