Как отсортировать результаты поиска MySQL по значимости?

У меня есть похожий запрос на этот вопрос

MySQL - Как заказать по релевантности? INNODB Стол

Разница в том, что здесь я хочу искать из 5 полей как

add1, add2, add3, post_town, post_code

И только записи в поле post_code будут НЕ ПУСТЫ, в некоторых местах записи полей могут быть пустыми. Если я ищу ключевое слово Kingston, он возвращает

Acre Road, Kingston upon Thames, KT2 6EA

Kingston Road, Epsom, KT19 0DG

Kingston Road, Epsom, KT20 0DH

и эти результаты являются комбинацией всех полей add1, add2, add3, post_town, post_code

Мне нужен этот результат в следующем порядке

Kingston Road, Epsom, KT19 0DG

Kingston Road, Epsom, KT20 0DH

Acre Road, Kingston upon Thames, KT2 6EA

Мой текущий SQL-запрос выглядит так

SELECT add1, add2, add3, post_town, post_code FROM address_mst 
WHERE add1 LIKE '%".$keyword."%'
OR add2 LIKE '%".$keyword."%'
OR add3 LIKE '%".$keyword."%'
OR post_town LIKE '%".$keyword."%'
OR post_code LIKE '%".$keyword."%'

Поэтому мне нужны записи с поиском по ключевому слову: вначале будет первым. Как я могу это сделать?

3 ответа

Решение

Не самая красивая, но должна работать!

select a.* from (
SELECT add1, add2, add3, post_town, post_code, 1 as rank FROM address_mst 
WHERE add1 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 2 as rank FROM address_mst 
WHERE add2 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 3 as rank FROM address_mst 
WHERE add3 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 4 as rank FROM address_mst 
WHERE post_town LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 5 as rank FROM address_mst 
WHERE post_code LIKE '%".$keyword."%'
) a
order by a.rank asc;

Почему бы не выбрать минимальные квалифицирующие результаты с запросом и использовать собственную логику в сценарии, чтобы заранее оценить вес вашего результата и отсортировать их соответствующим образом?

Это поможет вам:

  1. Имейте более сложные критерии ранжирования, которые могут или не могут быть возможны в запросе.

  2. Не редактировать SQL-запрос, если ваши критерии ранжирования изменяются.

Для сортировки на основе релевантности ПОЛНЫЙ ТЕКСТОВЫЙ ПОИСК является более надежным вариантом.

FULL TEXT SEARCH использованная релевантность, основанная на количестве вхождений искомого термина, которые впоследствии могут быть использованы для возврата результатов ORDER.

Другие вопросы по тегам