Оптимизация полнотекстового поиска в MySQL - PullRequest
15 голосов
/ 20 мая 2011

Я хочу сделать поиск с полным текстом в моей сети.Мне нужен поиск с нумерацией страниц.В моей базе данных более 50 000 строк на таблицу.Я изменил свою таблицу и сделал (title,content,date) индексом.таблица всегда обновляется, там все еще есть столбец id, который является автоматическим увеличением.и последний date всегда находится в конце таблицы.

date  varchar(10)
title  text
content  text

, но все время запроса будет стоить 1.5+ seconds.Я ищу много статей через Google, некоторые пишут, что только ограничение длины слова в поле Index может помочь в поиске быстрее.но как text тип, он can not изменяет определенную длину таким образом (я пробовал ALTER TABLE table_1 CHANGE title title TEXT(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, не работает)

date  varchar(10)
title  text(500)
content  text(1000)

так, кроме Sphinx и сценарий третьей части.Как оптимизировать полнотекстовый поиск только с SQL?код запроса здесь:

(SELECT 
title,content,date 
FROM table_1 
WHERE MATCH (title,content,date) 
AGAINST ('+$Search' IN BOOLEAN MODE)) 
UNION 
(SELECT 
title,content,date 
FROM table_2 
WHERE MATCH (title,content,date) 
AGAINST ('+$Search' IN BOOLEAN MODE)) 
Order By date DESC

Спасибо.

Ответы [ 3 ]

10 голосов
/ 23 мая 2011

Исходя из последующих комментариев к вопросу, у вас есть столбец btree для ваших столбцов, а не полнотекстовый индекс.

Для MATCH (заголовок, контент) для поиска вам потребуется:

CREATE FULLTEXT INDEX index_name ON tbl_name (title,content);

Я не уверен, что он примет там поле даты (последнее, вероятно, в любом случае не имеет значения).

6 голосов
/ 23 мая 2011

У меня есть всеобъемлющий план для вас, чтобы максимально оптимизировать MySQL для индексации FULLTEXT

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

Это раздражало некоторых людей на протяжении многих лет из-за того, что они не знали, что более 600 слов исключены из индекса FULLTEXT .

Вот табличное представление этих стоп-слов .

Есть два способа обойти это

Вариант обхода 1) Создать собственный список стоп-слов.

На самом деле вы можете отправить в mysql список предпочитаемых стоп-слов.Вот значение по умолчанию:

mysql> show variables like 'ft%';
+--------------------------+----------------+
| Variable_name            | Value          |
+--------------------------+----------------+
| ft_boolean_syntax        | + -><()~*:""&| |
| ft_max_word_len          | 84             |
| ft_min_word_len          | 4              |
| ft_query_expansion_limit | 20             |
| ft_stopword_file         | (built-in)     |
+--------------------------+----------------+
5 rows in set (0.00 sec)

ОК, не давайте создавать наш список стоп-слов.Я обычно устанавливаю английские статьи в качестве единственных стоп-слов.

echo "a"    > /var/lib/mysql/stopwords.txt
echo "an"  >> /var/lib/mysql/stopwords.txt
echo "the" >> /var/lib/mysql/stopwords.txt

Затем добавьте параметр в /etc/my.cnf плюс добавьте одно-, двухбуквенные и трехбуквенные слова

[mysqld]
ft_min_word_len=1
ft_stopword_file=/var/lib/mysql/stopwords.txt

Наконец, перезапустите mysql

service mysql restart

Если у вас уже есть какие-либо таблицы с индексами FULLTEXT, вы должны отбросить эти индексы FULLTEXT и создать их заново.

Пропустить вариант 2) Перекомпилируйте исходный код

Имя файла: storage / myisam / ft_static.c.Просто измените структуру C, которая содержит более 600 слов, чтобы она была пустой.Получайте удовольствие от перекомпиляции !!!

Теперь, когда конфигурация FULLTEXT затвердела, рассмотрим еще один важный аспект:

Пишите правильные рефакторизованные запросы, чтобы оптимизатор запросов MySQL работал правильно!!!

То, что я сейчас упоминаю, действительно недокументировано: всякий раз, когда вы выполняете запросы, которые выполняют JOINs, а предложение WHERE содержит функцию MATCH для поиска FULLTEXT, это приводит к тому, что MySQL Query Optimizer обрабатываетзапрос, как полное сканирование таблицы, когда дело доходит до поиска столбцов, включенных в индекс FULLTEXT.Если вы планируете запросить таблицу с использованием индекса FULLTEXT, ВСЕГДА реорганизуйте свой запрос, чтобы поиск FULLTEXT возвращал только ключи в подзапросе и подключал эти ключи к основной таблице .В противном случае индекс FULLTEXT поместит оптимизатор запросов MySQL в штопор.

1 голос
/ 27 мая 2011

Дополнительные идеи по оптимизации полнотекстового поиска в MySQL см. Как оптимизировать MySQL Boolean Full-Text Search?(Или чем его заменить?) - C #

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