Как можно улучшить этот длинный поисковый запрос mysql? - PullRequest
2 голосов
/ 19 июля 2011

В поисках улучшения этого оператора выбора mysql для поискового запроса:

Select * from table WHERE ( user = '$search_query'
OR user LIKE '$search_query %'
OR keyword LIKE '$search_query'
OR tag LIKE '$search_query'
OR tag LIKE '% $search_query'
OR tag LIKE '% $search_query%'
OR tag LIKE '$search_query%'
OR REPLACE(question, ',' ,'') LIKE '$search_query %'
OR REPLACE(question, ',' ,'') LIKE '% $search_query'
OR REPLACE(question, ',' ,'') LIKE '% $search_query %' 
OR REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(question, '\'', ''), ',', ''), '.',''), ':',''), ';',''), '!',''), '?','') LIKE '%$search_query%'
)

Причина, по которой он сломался, заключается в том, что если кто-то ищет слово "art", я не хочуон также показывает результаты для «сердца».

Мне действительно нужно иметь те же функции, но с меньшим количеством ресурсов.

Ответы [ 3 ]

4 голосов
/ 19 июля 2011

Если ваша таблица MyISAM, вы можете создать для нее индекс FULLTEXT:

CREATE FULLTEXT INDEX fx_mytable_user_tag_question ON mytable (user, tag, question)

SELECT  *
FROM    mytable
WHERE   MATCH(user, tag, question) AGAINST ('+some*' IN BOOLEAN MODE)

Этот запрос вернет some и something, но не awesome.

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

Byпо умолчанию минимальная длина поискового запроса составляет 4 символов, поэтому упомянутое в вашем примере art не будет найдено.

Чтобы обойти это, вам придется изменить параметр ft_min_word_len в настройках сервера..

1 голос
/ 19 июля 2011

Похоже,

OR tag LIKE '$search_query'
OR tag LIKE '$search_query%'

вернет идентичные результаты только для запуска

OR tag LIKE '$search_query%'

То же самое с

OR tag LIKE '% $search_query'
OR tag LIKE '% $search_query%'

Обдумывая этот вопрос, я узнал, что MySQL поддерживает поиск по регулярному выражению . Используя их, вы можете указать, какому шаблону должен соответствовать %. Это поможет со всеми этими неприятными пробелами, потому что вы можете просто использовать \s?.

0 голосов
/ 19 июля 2011

Реструктурируйте свою базу данных таким образом, чтобы теги сохранялись в отдельной таблице, с одной строкой для каждого тега в вопросе, чтобы вы могли выполнить запрос, например:

SELECT * FROM question
WHERE question_id IN (
  SELECT question_id FROM question_tags WHERE tag = '$search_query'
) OR <...>

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

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