簡體   English   中英

SQL Server 2005全文搜索多個表和列

[英]SQL Server 2005 Full Text Search over multiple tables and columns

我正在尋找一個有效地使用SQL Serve r2005的containstable功能的好的解決方案。 目前,我有一個Employee和一個Address表。

-Employee
Id
Name

-Address
Id
Street
City
EmployeeId

現在,用戶只能在一個文本框中輸入搜索詞,我希望將這些詞拆分並使用“ AND”運算符進行搜索。 FREETEXTTABLE似乎可以自動使用“ OR”。

現在,假設用戶輸入了“約翰漢堡”。 這意味着他想在漢堡找到約翰。 這就是“約翰和漢堡”。

因此,以下內容將不包含任何結果,因為CONTAINSTABLE會檢查“ John AND Hamburg”的每一列。

所以我的問題是:用AND運算符跨多個列/表執行全文搜索的最佳方法是什么?

SELECT *
FROM Employee emp
    INNER JOIN 
        CONTAINSTABLE(Employee, *, '(JOHN  AND Hamburg)', 1000) AS keyTblSp
        ON sp.ServiceProviderId = keyTblSp.[KEY]    
    LEFT OUTER JOIN [Address] addr ON addr.EmployeeId = emp.EmployeeId
UNION ALL
SELECT *
FROM Employee emp 
    LEFT OUTER JOIN [Address] addr ON addr.EmployeeId = emp.EmployeeId
    INNER JOIN 
        CONTAINSTABLE([Address], *, '(JOHN  AND Hamburg)', 1000) AS keyTblAddr
        ON addr.AddressId = keyTblAddr.[KEY]    

...

這更多是語法問題。 您如何只用一個輸入框就能了解用戶的意圖?

  • 他們在尋找“約翰漢堡”的人嗎?
  • 他們在尋找“約翰漢堡街”嗎?
  • 他們在尋找住在斯普林菲爾德“漢堡街”上的“約翰”嗎?
  • 他們在尋找住在“漢堡”市的“約翰”嗎?

在不了解用戶意圖的情況下,您所希望的最好是對術語進行“或”運算,並獲得最高的排名。

否則,您需要根據傳遞的單詞數來編寫大量邏輯程序:

2個字:

在術語1的Employee數據中搜索,在術語2的Employee數據中搜索,在術語1的Search Address數據中進行搜索。在術語2的Search Address數據中進行搜索。

3個字:

搜索術語1的員工數據,術語2的員工數據,術語3的員工數據,術語1的搜索地址數據,術語2的搜索地址數據,術語3的搜索地址數據。術語3的搜索結果數據。命中。

等等...

我想我將重新設計GUI,以至少將輸入分為名稱和地址。 如果不可能,則強制執行語法規則,使其達到“將第一個單詞視為名稱,直到出現逗號為止,之后的任何單詞都將視為地址”。

編輯:

您最好還是按條件進行,並獲得最高排名。 這是一個示例,以及為什么沒有對輸入進行一些預處理以了解用戶意圖的原因,這是不理想的:

insert into Employee (id, [name]) values (1, 'John Hamburg')
insert into Employee (id, [name]) values (2, 'John Smith')
insert into Employee (id, [name]) values (3, 'Bob Hamburg')
insert into Employee (id, [name]) values (4, 'Bob Smith')
insert into Employee (id, [name]) values (5, 'John Doe')

insert into Address (id, street, city, employeeid) values (1, 'Main St.', 'Springville', 1)
insert into Address (id, street, city, employeeid) values (2, 'Hamburg St.', 'Springville', 2)
insert into Address (id, street, city, employeeid) values (3, 'St. John Ave.', 'Springville', 3)
insert into Address (id, street, city, employeeid) values (4, '5th Ave.', 'Hamburg', 4)
insert into Address (id, street, city, employeeid) values (5, 'Oak Lane', 'Hamburg', 5)

現在,由於我們不知道哪些關鍵字將應用於哪個表,因此我們必須假定它們可以應用於任何一個表,因此我們必須對每個表進行術語“或”運算,然后對結果進行UNION,匯總它們,然后計算最高排名。

SELECT Id, [Name], Street, City, SUM([Rank])
FROM
(
    SELECT emp.Id, [Name], Street, City, [Rank]
    FROM Employee emp 
    JOIN [Address] addr ON emp.Id = addr.EmployeeId
    JOIN CONTAINSTABLE(Employee, *, 'JOHN OR Hamburg') AS keyTblEmp ON emp.Id = keyTblEmp.[KEY]

    UNION ALL

    SELECT emp.Id, [Name], Street, City, [Rank]
    FROM Employee emp 
    JOIN [Address] addr ON emp.Id = addr.EmployeeId
    JOIN CONTAINSTABLE([Address], *, 'JOHN OR Hamburg') AS keyTblAdd ON addr.Id = keyTblAdd.[KEY]   
) as tmp

GROUP BY Id, [Name], Street, City
ORDER BY SUM([Rank]) DESC

這並不理想,這是您從示例中得到的結果(對於您而言,您希望漢堡的John Doe首先出現):

 Id Name Street City Rank 2 John Smith Hamburg St. Springville 112 3 Bob Hamburg St. John Ave. Springville 112 5 John Doe Oak Lane Hamburg 96 1 John Hamburg Main St. Springville 48 4 Bob Smith 5th Ave. Hamburg 48 

但這是最好的方法,您無需在將輸入提交給SQL以便對用戶想要的內容做出“最佳猜測”之前就無需解析輸入。

我有同樣的問題。 這是我的解決方案,適用於我的情況:

我創建了一個視圖,該視圖返回所需的列。 我添加了另一個額外的列,該列匯總了我要搜索的所有列。 因此,在這種情況下,視圖將像

SELECT emp.*, addr.*, ISNULL(emp.Name,'') + ' ' + ISNULL(addr.City, '') AS SearchResult 
FROM Employee emp 
    LEFT OUTER JOIN [Address] addr ON addr.EmployeeId = emp.EmployeeId

之后,我在SearchResult列上創建了全文索引。 然后,我在此列上進行搜索

SELECT *
FROM vEmpAddr ea
INNER JOIN CONTAINSTABLE(vEmpAddr, *, 'John AND Hamburg') a ON ea.ID = a.[Key]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM