Вопрос по indexing, mysql, php – оптимизировать таблицы для поиска, используя предложение LIKE в MySQL

2

Я создаю функцию поиска для части сообщений на моем сайте, и у меня есть база данных сообщений с немногим более 9 000 000 строк и индексирование поsender, subject, а такжеmessage поля. Я надеялся использовать в моем запросе предложение LIKE mysql, например (ex)

ВЫБРАТЬsender, subject, message ОТMessages ГДЕmessage LIKE "% EXAMPLE_QUERY%";

чтобы получить результаты. к сожалению, MySQL не использует индексы, когда присутствует начальный подстановочный знак, и это необходимо для того, чтобы поисковый запрос мог появляться в любом месте сообщения (именно так работают подстановочные знаки, не так ли?). Запросыvery very slow и я также не могу использовать полнотекстовый индекс из-за раздражающего правила 50% (я просто не могу позволить себе так много исключать). Есть ли в любом случае (или даже какая-либо альтернатива этому) оптимизировать запрос, используя like и два подстановочных знака? Любая помощь приветствуется.

@RobinCastlin Я мог бы, это только пример. но поиск по содержимому сообщения является важной функцией в любом приложении сообщений roozbubu
У вас есть 9 миллионов строк, и вы не можете фильтровать что-либо еще, кроме сообщения? Нет отправки или отправителя? Robin Castlin
@nnichols плохо проверю! roozbubu
Посмотри наSphinxSE, Я люблю это для такого рода вещей. nnichols

Ваш Ответ

4   ответа
0

'%EXAMPLE_QUERY%'; очень очень плохая идея .. собираюсь дать вам немного

A. Избегайте подстановочных знаков в начале использования запросов LIKE'EXAMPLE_QUERY%'; вместо

Б. Создайте ключевые слова, где вы можете легко использоватьMATCH

спасибо за советы! но есть две проблемы: если избежать начального подстановочного знака, не будет ли он искать только то, что НАЧИНАЕТСЯ с этого запроса, поэтому, если он обнаруживается посередине, он недействителен? б) правило 50% запрещает мне использовать предложения сравнения / против roozbubu
-3
select * from emp where ename like '%e';

select * from emp where ename like 'A%';

дает emp_name, начинающееся с буквы a.

select * from emp where ename like '_a%';

дает emp_name, в котором вторая буква является.

-1 ОП четко знает, как использовать LIKE.
3

что вы не можете), самостоятельно создать полнотекстовый поиск или разгрузить поиск из MySQL и использовать Sphinx / Lucene. Для Lucene вы можете использовать реализацию Zend_Search_Lucene из Zend Framework или использовать Solr.

Обычные индексы в MySQL - это деревья B +, и их нельзя использовать, если начало строки неизвестно (и это имеет место, когда в начале используется подстановочный знак)

Другой вариант - реализовать поиск самостоятельно, используя справочную таблицу. Разделите текст на слова и создайте таблицу, которая содержит слово record_id. Затем в поиске вы разбиваете запрос на слова и ищите каждое из слов в справочной таблице. Таким образом, вы не ограничиваете себя началом всего текста, а только началом данного слова (и в любом случае вы будете соответствовать остальным словам)

отличный! все, что мне нужно было знать два вопроса, хотя. 1. существует ли какой-либо известный способ заставить mysql игнорировать правило 50% при использовании полнотекстового поиска? 2. Будет ли библиотека Lucene сделать поиск эффективными? roozbubu
@roozbubu, насколько я знаю, полнотекстовые запросы, содержащие IN BOOLEAN MODE, не используют правило 50% -read documentation
это правильно! благодарю вас roozbubu
0

вы должны использовать индексы FULL TEXT. Полнотекстовые индексы индексируют слова в текстовом блоке. Затем можно выполнить поиск по основам слова и вернуть результаты в порядке релевантности. Таким образом, вы можете найти слово «пример» внутри блока текста, но вы по-прежнему не можете эффективно выполнять поиск по "xampl" найти "пример".

Полнотекстовый поиск MySQL невелик, но он функционален.

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

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