Как отсортировать результат поиска mysql по релевантности?


У меня есть аналогичный запрос, как задано на этот вопрос

MySQL-как упорядочить по релевантности? INNODB Таблица

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

Добавьте 1, 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

И эти результаты являются комбинацией всех поля добавьте 1, 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 2

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;

Для сортировки на основе релевантности, полнотекстовый поиск является более надежным вариантом.

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

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

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

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

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