Как отсортировать результаты поиска MySQL по значимости? - PullRequest
3 голосов
/ 28 сентября 2011

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

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 ]

5 голосов
/ 28 сентября 2011

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

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 голос
/ 28 сентября 2011

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

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

1 голос
/ 28 сентября 2011

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

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

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

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

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