PHP в деталях



         

По следам поиска ещё раз


DL
28.9.2001

Комментарии к предыдущему материалу Олега Юсова.

Упражнения в настройках и запросах.

Сначала как добавить FULLTEXT-индекс:

mysql> alter table articlea add fulltext(ztext);

ERROR 1073: BLOB column 'ztext' can't be used in key specification with the used table type

mysql> alter table articlea type=myisam;

Query OK, 36 rows affected (0.60 sec)

Records: 36 Duplicates: 0 Warnings: 0

mysql> alter table articlea add fulltext(ztext);

Query OK, 36 rows affected (10.00 sec)

Records: 36 Duplicates: 0 Warnings: 0

Текстовые индексы можно делать только в таблицах типа MyISAM. Тексты берутся из таблицы и скидываются в файл индекса, и растёт объём базы.

По поводу запросов.

Нельзя поле relev использовать в клаузе WHERE:

SELECT *, MATCH field AGAINST ('$searchwords') as relev FROM table WHERE relev>0 ORDER BY relev DESC

хотя можно:

SELECT *, MATCH field AGAINST ('$searchwords') as relev FROM table WHERE MATCH field AGAINST ('$searchwords')>0 ORDER BY relev DESC

Вычисленное поле, конечно же, нельзя использовать в WHERE по всем правилам синтаксиса, но можно использовать в HAVING:

SELECT *, MATCH field AGAINST ('$searchwords') as relev FROM table HAVING relev>0 ORDER BY relev DESC

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

Убираем условие "relev>0", оставляем сортировку. Остальное, как и раньше? рубим полученную строку и превращаем в запрос с несколькими операторами LIKE:

SELECT *,MATCH field AGAINST ('$searchwords') AS relev FROM table WHERE field LIKE '%$word1%' OR field LIKE '%$word2%' ORDER BY relev DESC, datefield DESC

Логи, которые я теперь собираю по технологии, которую предложил RomikChef, работают гораздо лучше. Скорость выборки на удивление осталась прежней, зато объём файлов, в которых лежат таблицы, сократился в 10 раз.

Кому надо, могут скачать () [].




Содержание  Назад  Вперед