2013-05-14 5 views
1

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

Проблема заключается в том, что запросы могут занять более 5 минут, в зависимости от того, сколько поисковых терминов используется.

Моя задача - взять термин поиска и найти точный термин поиска, а также некоторые варианты слова, такие как множественное число, заканчивающееся на 'ing', или термин поиска, за которым следует любая пунктуация, но НЕ фрагменты слова, поэтому «автомобиль» не должен соответствовать «карабину» или «шрам». Можно использовать бесконечное количество поисковых терминов, но когда число начинает превышать 6, оно становится невыносимо длинным.

Вот пример моего запроса:

SELECT `id` FROM `table` WHERE (( 
    `name` REGEXP "[[:<:]]sesame street[[:>:]]" OR 
    `name` REGEXP "sesame street[[:punct:]]" OR 
    `name` REGEXP "[[:<:]]sesame street.?ing[[:>:]]" OR 
    `name` REGEXP "[[:<:]]sesame street.?s[[:>:]]" 
) OR ( 
    `venue` REGEXP "[[:<:]]disney[[:>:]]" OR 
    `venue` REGEXP "disney[[:punct:]]" OR 
    `venue` REGEXP "[[:<:]]disney.?ing[[:>:]]" OR 
    `venue` REGEXP "[[:<:]]disney.?s[[:>:]]" 
)) 
AND `name` NOT LIKE "% tantrum %" 
AND `name` NOT LIKE "% stepkids %" 
AND `date` >= CURDATE() 
ORDER BY `date` ASC; 

Запрос использует одну таблицу, так что таблица не присоединиться вопросы.

В одном запросе может содержаться 30 различных ключевых слов, которые могут быть включены или исключены, а затем существуют варианты этих поисковых терминов, поэтому каждый термин может создавать 5 различных условных выражений. Поскольку запрос использует REGEXP, единственным индексом, который может быть использован, является поле date, хотя индексы настроены на name и venue. Я подумал об изменении своей поисковой системы, чтобы вместо этого использовать что-то вроде Solr, но даже тогда я не думаю, что это сработает, учитывая специфику, которую требует поиск.

Любые советы очень ценятся. Спасибо

ответ

0

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

Вместо использования:

`venue` REGEXP "[[:<:]]disney[[:>:]]" OR 
`venue` REGEXP "disney[[:punct:]]" OR 
`venue` REGEXP "[[:<:]]disney.?ing[[:>:]]" OR 
`venue` REGEXP "[[:<:]]disney.?s[[:>:]]" 

Вы могли бы написать:

`venue` REGEXP "[[:<:]]disney(.?(s|ing))?[[:>:]]" 

Вам не нужно "disney[[:punct:]]", как [[:>:]] будет соответствовать между словами и знаками препинания.

Смежные вопросы