2015-10-07 40 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不适用于那样的字符串。但你可以随时选择其他分配器功能。这个想法保持不变。 –