PHP MySQL поиск и сортировка по релевантности

Я знаю, как выполнять обычный поиск php mysql и отображать результаты. Однако из-за характера того, что я пытаюсь выполнить, мне нужно иметь возможность сортировать по релевантности. Позвольте мне объяснить это лучше:

Обычный запрос «приложения apple iphone» будет искать в базе данных с использованием% apple iphone application%, но если нет записей, отображающих эту фразу в таком точном порядке, поиск ничего не даст.

Что мне в основном нужно сделать, так это искать «яблоко», «iphone» и «приложения» по отдельности, а затем объединить результаты в один, а затем мне нужно оценить релевантность по тому, сколько экземпляров слова найдено в записях. . Например, если я сделал то, что хотел, и он вернул мне следующее:

Iphone Applications From Apple
Apple Make The Best Apple Iphone Applications
Iphone Applications

Они будут ранжироваться следующим образом:

Apple Make The Best Apple Iphone Applications
Iphone Applications From Apple
Iphone Applications

Из-за того, сколько экземпляров поискового запроса найдено. См. Выделенное:

[Apple] Make The Best [Apple] [Iphone] [Applications]
[Iphone] [Applications] From [Apple]
[Iphone] [Applications]

Надеюсь, я достаточно хорошо объяснил это, и был бы чрезвычайно благодарен, если бы кто-нибудь мог дать мне какие-либо указания.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
13
0
18 400
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Быстрый гугл дал мне эта ссылка.

Пример:

select title, match (title,content) against (”internet”) as score 
from cont 
where match (title,content) against (”internet”) limit 10;
Ответ принят как подходящий

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

Единственная потенциальная проблема с использованием полнотекстовых индексов заключается в том, что они не поддерживаются таблицами InnoDB.

Я знаю, что это старое, но если кто-то на это наткнется. теперь они поддерживаются innoDB

Dreaded semicolon 23.02.2017 07:52

Спасибо за этот комментарий. Я разговаривал с моим коллегой, и он заверил меня, что я не могу использовать FULLTEXT, но, поскольку я прочитал ваш комментарий .... Спасибо.

Korovjov 13.06.2020 14:26
SELECT field2, field3, ..., MATCH(field1, field2) AGAINST ("search string") AS relevance WHERE MATCH(field1, field2) AGAINST "search string" ORDER BY relevance DESC LIMIT 0,10

В наборе результатов будет поле «релевантность», которое здесь используется для сортировки результатов.

Для любого, кто хочет сопоставить «строку поиска» как два отдельных слова (т.е. любое слово является релевантным) и у вас есть индекс FULLTEXT в ваших столбцах, вам может потребоваться использовать AGAINST («строка поиска» В БУЛЕВОМ РЕЖИМЕ), чтобы убедиться, что Возвращенная оценка релевантности не равна 0. Мне нужно было добавить это к моим запросам, потому что MySQL возвращал оценку релевантности только в том случае, если совпадала точная фраза, а не когда совпадали только некоторые из слов. Пример Мурата хорош, потому что MySQL не выполняет сортировку по релевантности, когда AGAINST (... IN BOOLEAN MODE) используется в предложении WHERE.

Noel Whitemore 07.09.2018 19:11

Может быть, это может кому-то помочь (упорядочить по релевантности и вести подсчет слов):

Нет полнотекстового:

SELECT *, ( (value_column LIKE '%rusten%') + (value_column LIKE '%dagen%') + (value_column LIKE '%bezoek%') + (value_column LIKE '%moeten%') ) as count_words
FROM data_table
WHERE (value_column LIKE '%dagen%' OR value_column LIKE '%rusten%' OR value_column LIKE '%bezoek%' OR value_column LIKE '%moeten%')
ORDER BY count_words DESC

Полный текст:

SELECT * FROM data_table
WHERE MATCH(value_column) AGAINST('+dagen +rusten +bezoek +moeten' IN BOOLEAN MODE)
ORDER BY MATCH(value_column) AGAINST('+dagen +rusten +bezoek +moeten' IN BOOLEAN MODE) DESC;

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

cmann 10.06.2015 01:14

Я не знаю, что именно вы хотите, но следующий код определенно сработает для вас.

SELECT ("some text here" or `column_name`) RLIKE "Apple|Iphone|Application" AS Result ORDER BY Result DESC;

Разделите все слова чертой (|), но результат будет равен 1 или 0, соответственно. Если вы хотите создать ряды, смотрите ниже.

SELECT * FROM "table_name" WHERE `column_name` RLIKE "Apple|Iphone|Application";

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