Sql Server поиск по нескольким словам и ранжирование результатов - PullRequest
4 голосов
/ 24 января 2012

Предположим, что пользователь вводит "Vintage Audi Car" в качестве критерия поиска

В моей таблице есть поле "Описание" как Varchar (Max)

Я хочу найти введенные пользователем значения как Винтаж ИЛИ ИЛИ ИЛИ Автомобиль. Результат должен отображать строки, которые содержат все три слова в «Description» вверху и строки с любыми двумя словами, а затем строки с любым одним словом.

Дайте мне знать, как этого можно достичь.

Я открыт для использования полнотекстового поиска.

Ответы [ 3 ]

2 голосов
/ 08 февраля 2012

Это должно быть возможно при полнотекстовом поиске с командой CONTAINSTABLE:

SELECT * FROM Car 
INNER JOIN CONTAINSTABLE(Car, Description, 'ISABOUT (Vintage weight (.5), Audi weight (0.5), Car weight (0.5) )') AS A 
   ON Car.Id = A.[KEY] 
ORDER BY A.[RANK] DESC;

Ранг рассчитывается по весу, поэтому строка с описанием «Винтаж Ауди» получит более высокий ранг, чемстрока с описанием «Ауди».

1 голос
/ 24 января 2012

Вот один из способов достижения этого результата с помощью оператора LIKE:

select Description
from MyTable
where Description like '%Vintage%' OR Description like '%Audi%' OR Description like '%Car%'
order by (case when Description like '%Vintage%' then 1 else 0 end
+ case when Description like '%Audi%' then 1 else 0 end
+ case when Description like '%Car%' then 1 else 0 end) DESC

Предложение WHERE ограничивает результат описаниями, которые содержат хотя бы одно из слов (следовательно, OR).ORDER BY добавляет 1 для каждого слова из списка, в результате чего элементы с более высоким счетом попадают в начало.

0 голосов
/ 09 октября 2012

Даже у меня была такая же проблема, я решил ее, используя двигатель MYISAM

изменив таблицу автомобилей

ALTER TABLE  Car ENGINE = MYISAM;

затем

select * FROM Car WHERE MATCH (Description) AGAINST ('Vintage Audi Car'  IN BOOLEAN MODE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...