Я знаю, как выполнять обычный поиск 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]
Надеюсь, я достаточно хорошо объяснил это, и был бы чрезвычайно благодарен, если бы кто-нибудь мог дать мне какие-либо указания.






Быстрый гугл дал мне эта ссылка.
Пример:
select title, match (title,content) against (”internet”) as score
from cont
where match (title,content) against (”internet”) limit 10;
взгляните на Функции поиска MySQL FULLTEXT, Они должны автоматически возвращать результаты по релевантности и давать вам гораздо больший контроль над поиском.
Единственная потенциальная проблема с использованием полнотекстовых индексов заключается в том, что они не поддерживаются таблицами InnoDB.
Спасибо за этот комментарий. Я разговаривал с моим коллегой, и он заверил меня, что я не могу использовать FULLTEXT, но, поскольку я прочитал ваш комментарий .... Спасибо.
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.
Может быть, это может кому-то помочь (упорядочить по релевантности и вести подсчет слов):
Нет полнотекстового:
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;
Это сработало для меня. Мне нужны результаты, отсортированные по релевантности, но я также хотел, чтобы возвращались частичные совпадения, которые не поддерживает полнотекстовый поиск.
Я не знаю, что именно вы хотите, но следующий код определенно сработает для вас.
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";
Я знаю, что это старое, но если кто-то на это наткнется. теперь они поддерживаются innoDB