Какой SQL используется для поиска, аналогичного «Связанным вопросам» в Stackoverflow - PullRequest
6 голосов
/ 02 июня 2009

Я пытаюсь реализовать функцию, аналогичную «Связанные вопросы» в Stackoverflow.

Как мне написать оператор SQL, который будет искать в поле «Заголовок и сводка» моей базы данных похожие вопросы?

Если у меня есть вопросы: «Какой SQL используется для поиска, похожего на« Связанные вопросы »в Stackoverflow».

Шаги, о которых я могу подумать:

  1. Снять кавычки
  2. Разделите предложение на массив слов и выполните поиск SQL по каждому слову.

Если я сделаю это таким образом, я предполагаю, что я не получил бы никаких значимых результатов. Я не уверен, включен ли полнотекстовый поиск на сервере, поэтому я не использую его. Будет ли преимущество использования полнотекстового поиска?

Я нашел похожий вопрос, но ответа не было: Аналогичный вопрос

Использование SQL 2005

Ответы [ 8 ]

7 голосов
/ 02 июня 2009

Проверьте этот подкаст .

Один из наших главных показателей оптимизации для «связанных вопросы »запрос удаляет верх 10 000 самых распространенных английских словарей слова (как определено поиском Google) перед отправкой запроса в SQL Server 2008 полный текстовый движок. Это шокирует, как мало осталось от большинства посты, как только вы удалите топ 10k Английский словарь слов. Это помогает ограничить и сузить возвращаемые результаты, что делает запрос резко быстрее.

1 голос
/ 03 сентября 2009

После включения полнотекстового поиска на моем сервере SQL 2005 я использую следующую хранимую процедуру для поиска текста.

ALTER PROCEDURE [dbo].[GetSimilarIssues] 
(
 @InputSearch varchar(255)
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @SearchText varchar(500);

SELECT @SearchText = '"' + @InputSearch + '*"'

SELECT  PostId, Summary, [Description], 
Created
FROM Issue

WHERE FREETEXT (Summary, @SearchText);
END
1 голос
/ 02 июня 2009

Они, вероятно, связаны на основе тегов, которые добавляются к вопросам ...

0 голосов
/ 02 июня 2009

Я бы сказал, что это, вероятно, полнотекстовый поиск по названию вопроса, содержанию вопроса и ответам, а также по отдельным введенным вами словам (а не по всему заголовку). Затем, используя функции полнотекстового ранжирования, отображаются 10 или около того вопросов с наивысшим рейтингом.

Как отметил Тыдок, похоже, что они используют полнотекстовый поиск (я не мог представить себе другого способа).

Вот справочник MSDN по полнотекстовому поиску , в котором конкретный используемый запрос, вероятно, не произойдет.

0 голосов
/ 02 июня 2009

Похоже, ключевое слово основано на вводимом вами заголовке, сопоставлено с заголовками и содержанием других вопросов. Вероятно, это проще (и более уместно) сделать в Lucene (или аналогично), чем в реляционной базе данных.

0 голосов
/ 02 июня 2009

Вероятно, это делается с помощью полнотекстового поиска, который совпадает со словами / фразами. Я использовал его в MySQL и SQL Server с приличным успехом с готовой функциональностью.

Подробнее о полнотекстовом поиске MySQL можно узнать по адресу:

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

Или просто полнотекстовый поиск Google, и вы найдете много информации.

0 голосов
/ 02 июня 2009

Я уверен, что наиболее эффективно было бы реализовать эту функцию на основе тегов, связанных с каждым сообщением.

0 голосов
/ 02 июня 2009

SQL очень хорошо может быть просто «ВЫБРАТЬ * ОТ вопросов;». Мне трудно представить, что алгоритм поиска похожих вопросов реализован в SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...