2010-11-17 63 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