2015-10-07 73 views
0

我需要一些幫助,爲網站創建一個簡單的搜索引擎。基本思想是用戶將在搜索欄中輸入一個字符串,該字符串將在數據庫key_word中進行比較並獲取結果。如何使用sql server建立網站搜索引擎

比方說,我在下面的表格必須在SQL Server數據庫:

|----|----------|----------------------| 
| ID | URL  | key_word    | 
|----|----------|----------------------| 
| 1 | url1.com | cat short red NYC | 
| 2 | url2.com | tall blue LA   | 
| 3 | url3.com | skinny NYC green  | 
| 4 | url4.com | cat black get  | 
|----|----------|----------------------| 

現在,在搜索欄,可以說用戶想要搜索的字符串以下「從紐約得到紅貓」。我想在數據庫'key_word'中搜索這個。

String key = "get red cat from NYC" 

我曾嘗試:

到目前爲止,我有以下以下查詢,以便從數據庫中搜索。如果用戶只想搜索一個單詞,這非常有用。但字符串'key'在這裏不起作用,它將返回0結果。我需要一些想法,這樣我可以做出更好的查詢。

SELECT * 
FROM [SearchTable] 
WHERE [key_Word] LIKE % key %; 

我想要什麼:

我想改變此SQL Server查詢,以便它返回ID = 1,3,4。

換句話說。我想取這個字符串:

String key = "get red cat from NYC" 

並首先在數據庫中搜索單詞「get」。它沒有出現,所以去下一個字。下一個字是「紅色」,這在ID = 1中顯示。下一個字是「貓」,這在ID = 1,4中顯示。下一個單詞是「from」,這不會顯示在任何行中。下一個詞是「NYC」,這在ID = 1,3中顯示。

把所有的ID放在一起,你得到ID = 1,1,4,1,3。

比我想排序,以便ID = 1顯示在頂部和ID = 3,4可以在按鈕,因爲他們是綁在一起。

我一直希望這樣做只有一個SQL查詢,因爲如果我一直連接到數據庫比速度也會下降。所以我想到了一些SQL Server的功能?

+0

爲什麼你的關鍵字不是原子的?像會慢,不可SARGable。索引不能使用。 – lad2025

+0

爲什麼不使用全文索引? –

回答

0

爲此需要一個字符串分隔符。看到這個article一些功能:

DECLARE @key VARCHAR(MAX) = 'get red cat from NYC' 

SELECT t.ID 
FROM tbl t 
CROSS APPLY dbo.SplitStrings_XML(t.key_word, ' ') tx 
INNER JOIN (
    SELECT Item 
    FROM dbo.SplitStrings_XML(@key, ' ') 
)k 
    ON k.Item = tx.Item 
GROUP BY T.ID 
ORDER BY COUNT(*) DESC 

SQL Fiddle


這裏是SplitStrings_XML功能:

CREATE FUNCTION dbo.SplitStrings_XML 
(
    @List  NVARCHAR(MAX), 
    @Delimiter NVARCHAR(255) 
) 
RETURNS TABLE 
WITH SCHEMABINDING 
AS 
    RETURN 
    ( 
     SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)') 
     FROM 
     ( 
     SELECT x = CONVERT(XML, '<i>' 
      + REPLACE(@List, @Delimiter, '</i><i>') 
      + '</i>').query('.') 
    ) AS a CROSS APPLY x.nodes('i') AS y(i) 
    ); 

,如果你的字符串有一個像>非法XML字符上述功能將無法正常工作,<&。您可以使用其他分離器,但這個想法保持不變。

+0

添加關於輸入的免責聲明,如「I <3紐約」。 XML方法可能會與某些字符崩潰。 – lad2025

+0

是的,XML Splitter不適用於那樣的字符串。但你可以隨時選擇其他分配器功能。這個想法保持不變。 –