代码之家  ›  专栏  ›  技术社区  ›  Jagd Dai

含与不含之间有显著差异?

  •  5
  • Jagd Dai  · 技术社区  · 14 年前

    我在启用了文件流的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'
    

    全文搜索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'
    

    两个全文搜索的唯一显著区别是query 1使用contains,query 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
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   Remus Rusanu    14 年前

    CONTAINSTABLE :

    top_n_by_rank

    指定只有排名最高的匹配项,按降序排列, 返回。仅当 指定整数值n。 如果 排名靠前的与其他的相结合 参数,查询可能返回 行数少于行数 这实际上符合所有 谓词。

    尝试不带上衣跑步,看看是否匹配 CONTAINS .