2009-11-26 78 views
9

我有什麼,我認爲是一個非常基本的場景,但我讀過使得它聽起來像這樣不容易使用SQL Server全文目錄和索引。與CONTAINSTABLE和全文索引布爾邏輯的多列

我有2列,名字和姓氏。我想支持他們的全文搜索,這樣如果有人輸入「約翰史密斯」的人,在上匹配首先和最後一個出現。

雖然可以很容易地創建跨多個列的索引,以及易查多列,得分並不反映多列。

SELECT [Key], Rank 
FROM CONTAINSTABLE([User], (FirstName,LastName), '<CLAUSE_HERE>') 
  1. 如果CLAUSE_HERE是「約翰·史密斯」我沒有得到任何結果,因爲這句話並不在任一領域的存在。
  2. 如果是「約翰·史密斯或」我與任一名稱的所有用戶在任何領域中,無益的順序進行排序。
  3. 如果它是「約翰和史密斯」,我沒有得到任何結果,因爲這兩個字段都不包含這兩個單詞。

似乎唯一的解決辦法是自動生成一個查詢,每個字段上運行containstable,做一些數學,總結分數等。這聽起來是對的嗎?有更簡單的方法嗎?我的實際查詢有更多的字段 - 這是一個簡單的例子。

回答

11

製作一個computed column,將您感興趣搜索的字段(以對您的搜索格式有意義的方式)和全文索引混合在一起。

據我所知,這是因爲你在你的問題的行爲描述的,如果你周圍要全文以這種方式唯一的工作。

+0

完全工作!爲什麼沒有全文自動執行此操作?我認爲在多列上應用全文可以像現成的那樣工作。可能不會。 – 2012-02-07 00:14:39

0

您將需要測試它,但我不知道你可能能夠使用ISABOUT()函數的權重應用到每個關鍵字。您的搜索條款可能類似於:

ISABOUT(john weight(0.2), smith weight(0.8)) 
+0

不是一個壞主意,但它不起作用。評分工作的方式似乎並不是列在一起的。所以,「約翰史密斯」在我的測試中得到與「約翰瓊斯」完全相同的分數。 – 2009-11-28 02:39:57

+0

您使用的是哪個版本的SQL Server?你有樣品/測試腳本嗎? – RickNZ 2009-11-28 03:48:33