MySQL и php FULLTEXT поиск делает больше, но не делает меньше? - PullRequest
1 голос
/ 24 июня 2011

Перечислено по этому вопросу: Проблема MySQL - ЗАВЕРШЕНИЕ переполнения сервера!Пожалуйста, сообщите все мои данные о сервере, поэтому мне не нужно переписывать их здесь.

Так что у меня PHP-скрипт, который взаимодействует с MySQL базы данных.2 дня назад, из-за большого количества запросов от моих пользователей, я переключился с классического "select * from table", где столбец как "blabla" и столбец как "lablab" "на полнотекстовый поиск.Проиндексированы, проверены, хорошо идти.2 дня на работе, уже получил пакет жалоб.

Поиски действительно лучше, то есть если вы используете полные слова ...: (

попробуйте поискать "яблоко", и вынайти почти те же результаты.

попробуйте поискать "компьютер Apple по низким ценам", и полнотекстовый поиск будет ПУТЬ выше любого ПОИСКА LIKE

попробуйте поискать "ple", и вы получите полный списокрезультатов классическим методом ... но большой жирный текст "Ничего не найдено" лежит перед вами с полнотекстовым поиском ...

Извините за то, что до этого момента это звучало поэтично ...: |

Есть ли обходной путь для этого? Заставить полный текст использовать какие-то чертовы подстановочные знаки? Например,% foo% должен принести мне ffoork, flfooor и т. Д ...

А для тех из вас, кто спрашиваетДа, я действительно не знаю, как разбираться в MySQL, кроме синтаксиса, простых выражений и основных функций.

Пожалуйста, помогите мне с фрагментом кода или ссылкой на какой-нибудь метод решения этого ... Если возможно,я бы предпочел не соблюдатьрасскажите о моем существовании с какой-нибудь сторонней поисковой системой mysql, но в крайнем случае ...

Заранее большое спасибо!Ура!

Извините, я забыл поставить код:

$query="SELECT *, 
    CASE when title like '%".$s."%' then 1 else 0 END as titlematch, 
    CASE when tags like '%".$s."%' then 1 else 0 END as tagsmatch,
    MATCH (title, tags) AGAINST ('".$s."') AS relevance 
    FROM videos  
    WHERE MATCH(title, tags) AGAINST ('".$s."' IN BOOLEAN MODE) 
    HAVING relevance > 0  
    ORDER by titlematch desc, tagsmatch desc, relevance desc, `datetime` desc, `views` desc
    ";

Ответы [ 3 ]

5 голосов
/ 24 июня 2011

Почему бы вам просто не использовать условие в вашей функции поиска PHP, и если было найдено одно слово или несколько символов, используйте хороший старый поиск LIKE?

3 голосов
/ 25 июня 2011

Если вы уже используете логический режим, вы можете обновить свой код PHP, чтобы автоматически добавлять символы подстановки вокруг строки поиска внутри AGAINST(...).Это должно решить вашу проблему при поиске по одному слову.

Вы также можете добавить символы подстановки вокруг каждого отдельного слова в случае поиска по нескольким словам, но я бы рекомендовал провести некоторое тестирование с реальными данными (например, с помощью поиска по ключевым словам), если вы их регистрируете), чтобы убедиться, что на релевантность текущего результата это не повлияет.


Обновление: попробуйте следующее:

SELECT
    *, 
    CASE when title like '%".$s."%' then 1 else 0 END as titlematch, 
    CASE when tags like '%".$s."%' then 1 else 0 END as tagsmatch,
    MATCH (title, tags) AGAINST ('*".$s."*' IN BOOLEAN MODE) AS relevance

FROM videos

WHERE
    title like '%".$s."%' OR
    tags like '%".$s."%' OR
    MATCH (title, tags) AGAINST ('*".$s."*' IN BOOLEAN MODE)

ORDER by
    titlematch desc, tagsmatch desc, relevance desc
3 голосов
/ 24 июня 2011

Загляните в BOOLEAN полнотекстовый поиск.Они позволяют использовать подстановочные знаки и другие операторы для выполнения сложных полнотекстовых поисков.

MySQL Boolean Полнотекстовый поиск

Если это не сработает для вас, альтернативное решение можетвыполнять аналогичный поиск, если полнотекстовый поиск возвращает 0 результатов.

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