Вопрос по mysql, database, full-text-search, sql – Заказать SQL по сильнейшему, как?

19

У меня есть следующий запрос:

SELECT * FROM table_name
WHERE (col_1 LIKE '%$keyword%'
    OR col_2 LIKE '%$keyword%'
    OR col_3 LIKE '%$keyword%')
  AND .... <some optional filters> ... 

Есть ли стратегия сортировки на основе наиболее релевантных результатов?

По "наиболее актуальным", вы имеете в виду, что совпадение наcol_1 имеет более высокий приоритет, чем совпадение сcol_2, и так далее Wiseguy
@ Wiseguy Извините, я удалил свой комментарий. kol
Вы имели в виду «фильтровать» вместо «сортировать»? Sebas
Что представляет собой наиболее релевантные результаты? codewaggle

Ваш Ответ

3   ответа
3

наибольшим количеством совпадений столбцов "LIKE".

MySQL, например, делает это с тем, что называетсяПОЛНЫЙ ТЕКС показатель

29

вам действительно нужен поиск на естественном языке, который поддерживается MySQL полнотекстовый поиск. Синтаксис отличается от нормальногонравитс запросов, и вам нужно добавить специальный индекс в таблицу, но упорядочение по релевантности возможно таким образом.

Вот как MySQL вычисляет релевантность (по ссылке):

Когда MATCH () используется в предложении WHERE, как в примере, показанном ранее, возвращаемые строки автоматически сортируются с наибольшей релевантностью. Значения релевантности являются неотрицательными числами с плавающей точкой. Нулевая релевантность означает отсутствие сходства. Релевантность вычисляется на основе количества слов в строке, количества уникальных слов в этой строке, общего количества слов в коллекции и количества документов (строк), которые содержат определенное слово.

То создать полнотекстовый индекс для существующей таблицы, использоватьПОЛНЫЙ ТЕКС модификатор:

CREATE FULLTEXT INDEX index_name
ON table_name (col1, col2, col3)

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

SELECT * FROM table_name
WHERE MATCH (col1,col2,col3)
AGAINST ('keyword' IN NATURAL LANGUAGE MODE);
31

что col_1 более релевантен, чем col_2 и т. Д., То:

select *
      ,case when col_1 like '%$keyword%' then 1
            when col_2 like '%$keyword%' then 2
            when col_3 like '%$keyword%' then 3
       end as [priority]
  from table_name
 where col_1 like '%$keyword%'
    or col_2 like '%$keyword%'
    or col_3 like '%$keyword%'
 order by [priority]

Если вы имели в виду наибольшее совпадение столбцов:

select *
      ,(case when col_1 like '%$keyword%' then 1 else 0 end) +
      ,(case when col_2 like '%$keyword%' then 1 else 0 end) +
      ,(case when col_3 like '%$keyword%' then 1 else 0 end) as [priority]
  from table_name
 where col_1 like '%$keyword%'
    or col_2 like '%$keyword%'
    or col_3 like '%$keyword%'
 order by [priority] desc
+ 1 для создания собственного рейтинга Wiseguy
Только что проверил, вам не нужен подзапрос, обновляющий ответ. Dominic Goulet
Не знаю, только ли это я, но мне пришлось убрать запятые после плюсов + ) искобки ( [] ) от[priority] чтобы код работал. Giraldi

Похожие вопросы