2015-10-07 2 views
0

Мне нужна помощь в создании простой поисковой системы для веб-сайта. Основная идея заключается в том, что пользователь вводит строку в строке поиска, которая будет сравнивать в базе данных key_word и получить результаты.Как создать поисковую систему для веб-сайта с использованием SQL-сервера

Допустим, у меня есть следующие таблицы в базе данных 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" 

То, что я пробовал:

До сих пор у меня есть следующие ниже запрос для поиска из базы данных. Это хорошо, если пользователь хочет найти только одно слово. но строковый «ключ» здесь не работает, и он вернет 0 результат. Мне нужна идея, поэтому я могу сделать этот лучший запрос.

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

Что я хочу:

Я хочу изменить этот запрос SQL-сервера, так что вернуть ID = 1,3,4.

Итак, другими словами. Я хочу взять эту строку:

String key = "get red cat from NYC" 

и первый поиск в базе данных слова «получить». он не появляется, поэтому переходите к следующему слову. Следующее слово «red», это отображается в ID = 1. Следующее слово «cat», это отображается в 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 New York'. Метод XML может сбой с некоторыми символами. – lad2025

+0

Да, XML Splitter не будет работать для такой строки.Но вы всегда можете выбрать другие функции сплиттера. Идея остается прежней. –

Смежные вопросы