contains和containstable之间有显着差异吗?

Jag*_*agd 6 t-sql full-text-search contains containstable

我在启用了文件流的varchar(max)类型的列上创建了全文索引。文件流包含诸如JPG,TIF,PDF和XML的数据(尽管我认为这与问题几乎无关)。

我创建了两个查询,这些查询使我可以搜索索引。

全文搜索#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'
Run Code Online (Sandbox Code Playgroud)

全文搜索#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'
Run Code Online (Sandbox Code Playgroud)

两次全文搜索之间唯一的显着区别是查询#1使用contains和查询#2使用containstable。

我的问题是两个查询并不总是产生相同的结果。例如,如果我搜索短语“ Independent contractors”,查询#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
Run Code Online (Sandbox Code Playgroud)

查询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
Run Code Online (Sandbox Code Playgroud)

Rem*_*anu 3

CONTAINSTABLE:

top_n_by_rank

指定仅返回排名最高的匹配项(按降序排列)。仅当指定整数值 n 时才适用。如果 top_n_by_rank 与其他参数结合使用,则查询返回的行数可能少于实际匹配所有谓词的行数。

尝试运行 w/oa top 并查看它是否匹配CONTAINS

  • 好的,这就是我发现的。如果我搜索术语“承包商”并且我将 top_n_by_rank 设置为 1000,则不会返回 RANK 13 或以下的任何结果,**即使我的总结果集远少于 1000 个返回的项目!** 这就是我的结果实在来不及这里。如果结果集的总数小于 1000,那么我不应该将所有内容都返回给我,无论任何项目的 RANK 是多少? (2认同)