2015-08-08 3 views
3

У меня есть сайт с базами данных магазинов. Посетители моего сайта может искать магазины по названию, в настоящее время SQL-запрос делается так:SQL-поиск и сортировка по наилучшим возможностям

SELECT * 
FROM tbl_shop 
WHERE LOWER(`name`) LIKE LOWER(`%text1%`) 
    OR LOWER(`name`) LIKE LOWER(`%text2%`) 
    ..... 
    OR LOWER(`name`) LIKE LOWER(`%textN%`) 

Это работает вполне нормально, но проблема в том, что результаты не сортируется по лучшему матчу. Некоторые имена магазинов содержат очень распространенные слова (например, «Na Lavce»), и если вы вводите эту строку, все салоны, содержащие «% na%» (что много), отображаются в виде результатов.

Из-за этого посетитель может получить много результатов, а иногда и не найти, что он ищет, потому что правильный результат, например, на пятой странице результатов. Любые идеи, как это исправить?

+1

Вы можете легко ранжировать их по количеству матчей, и вы можете также назначить предпочтение порядку условий. Но как еще вы узнаете, какой из них лучше? – shawnt00

+0

Вы также можете установить список общих слов и не искать эти слова, но для этого потребуется немного предварительной обработки. –

+0

Многие распространенные слова также являются более короткими словами. Вы можете оценивать по длине поисковых терминов каким-то образом, но я не сказал этого сначала, потому что я не уверен, что он надежный. – shawnt00

ответ

1
SELECT * 
FROM tbl_shop 
WHERE 
     LOWER(`name`) LIKE LOWER(`%text1%`) 
    OR LOWER(`name`) LIKE LOWER(`%text2%`) 
    ..... 
    OR LOWER(`name`) LIKE LOWER(`%textN%`) 
ORDER BY 
    CASE WHEN LOWER(`name`) LIKE LOWER(`%text1%`) THEN 1 ELSE 0 END + 
    CASE WHEN LOWER(`name`) LIKE LOWER(`%text2%`) THEN 1 ELSE 0 END + 
    ..... 
    CASE WHEN LOWER(`name`) LIKE LOWER(`%textN%`) THEN 1 ELSE 0 END 
    DESC 

Если вы хотите, чтобы ранжировать по порядку терминов:

ORDER BY 
    CASE WHEN LOWER(`name`) LIKE LOWER(`%text1%`) THEN 1024 ELSE 0 END + 
    CASE WHEN LOWER(`name`) LIKE LOWER(`%text2%`) THEN 512 ELSE 0 END + 
    CASE WHEN LOWER(`name`) LIKE LOWER(`%text2%`) THEN 256 ELSE 0 END + 
    ..... 
    CASE WHEN LOWER(`name`) LIKE LOWER(`%textN%`) THEN 1 ELSE 0 END 
    DESC 
+0

Спасибо, попробуем сейчас. Порядок условий случайный (посетители входят в них), поэтому, вероятно, это не для меня правильно? – kokoseq

+0

Я выяснил, что сортировка выполняется в моем приложении по атрибуту (порядок возвращенных строк игнорируется), поэтому мне нужно добавить ранг к результатам запроса ... Возможно ли это как-то? 'SELECT *, (CASE WHEN LOWER (' name') LIKE LOWER ('% text1%') THEN 1 ELSE 0 END + CASE КОГДА НИЖЕ ('name') LIKE LOWER ('% text2%') THEN 1 еще 0 концов) как заказ ОТ tbl_salon , где более низкое ('name') КАК ниже ('% текст1%') ИЛИ НИЖЕ (' name') LIKE ниже ('% текст2%') ORDER BY order' У этого есть синтаксическая ошибка, но я ищу что-то подобное – kokoseq

+0

Попробуйте ввести другое имя. «order» - это зарезервированное слово, и вам нужно его в кавычках, если вам действительно нужно использовать его таким образом. – shawnt00

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