Есть полнотекстовый поиск по ключевым словам. Для сортировки использую довольно стандартный подход:SELECT DISTINCT product_name,
MATCH (keywords) AGAINST ('CONSOLIDATED* 16* bearing*' IN BOOLEAN MODE) AS rate
FROM _TT
WHERE MATCH ( keywords ) AGAINST ('CONSOLIDATED* 16* bearing*' IN BOOLEAN MODE ) > 0
ORDER BY rate DESC
LIMIT 0,30Все бы хорошо, но когда количество записей в результате переваливает за 50 000 выборка делается около 2 секунд, а с учетом того, что общее количество записей более 5 миллионов, системе будет где потормозить. При этом, если убрать ORDER BY, то такое же количество записей выбирается 0,006 с. Очевидно, разница огромная.
Каким образом можно выкрутиться в данной ситуации?
может попробовать отказаться от boolean mode, тогда он сортирует по релевантности?
придется только настраивать минимальную длину слов, так как по умолчанию она 3 символа.
еще есть проблема что если текста мало и слово встречается часто, то оно будет причислено к стопслову и будет игнорироваться при поиске.попробуйте также (может он не склеивает запросы)
SELECT DISTINCT product_name,
MATCH (keywords) AGAINST ('CONSOLIDATED* 16* bearing*') AS rate
FROM _TT
WHERE MATCH ( keywords ) AGAINST ('CONSOLIDATED* 16* bearing*' IN BOOLEAN MODE )
ORDER BY rate DESC
LIMIT 0,30
В boolean mode он тоже сортирует по релевантности, но не учитывает то, что ключевые слова могут повторятся . Это меня устраивает учитывая специфику базы, а вот одинаковых слов будет много.В общем-то задача в том, как ускорить сортировку.
>В boolean mode он тоже сортирует по релевантности, но не учитывает то,
>что ключевые слова могут повторятся . Это меня устраивает учитывая специфику
>базы, а вот одинаковых слов будет много.
>
>В общем-то задача в том, как ускорить сортировку.Boolean full-text searches have these characteristics:
They do not automatically sort rows in order of decreasing relevance.небулен сразу сортирует. если он не устраивает, тогда увы.
>0 явно лишнее.
Да, ноль лишний. Это так сказать, атавизм, остался после разных экспериментов, забыл его удалить.Меня не устраивает обычный поиск тем, что для слов, встречающихся чаще, чем в 50% строк будет нулевой вес и такие записи не будут найдены вообще, возможно, этот порог можно изменить?
>Да, ноль лишний. Это так сказать, атавизм, остался после разных экспериментов, забыл
>его удалить.
>
>Меня не устраивает обычный поиск тем, что для слов, встречающихся чаще, чем
>в 50% строк будет нулевой вес и такие записи не будут
>найдены вообще, возможно, этот порог можно изменить?это понятно.
http://dev.mysql.com/doc/refman/5.0/en/fulltext-fine-tuning....
myisam/ftdefs.h
#define GWS_IN_USE GWS_PROB
заменить на
#define GWS_IN_USE GWS_FREQ
и пересобрать mysql.хотя они советуют все же использовать IN BOOLEAN вместо перекомпеляции.
Это я уже читал. Но булеан не сортирует по релевантности, а делать это другими средствами слишком медленно.
>Это я уже читал. Но булеан не сортирует по релевантности, а делать
>это другими средствами слишком медленно.Перекомпилировали?
>Это я уже читал. Но булеан не сортирует по релевантности, а делать
>это другими средствами слишком медленно.чудес не бывает, он делает order до limit.
>может попробовать отказаться от boolean mode, тогда он сортирует по релевантности?
>придется только настраивать минимальную длину слов, так как по умолчанию она 3
>символа.
>еще есть проблема что если текста мало и слово встречается часто, то
>оно будет причислено к стопслову и будет игнорироваться при поиске.Кроме этого, не в BOOLOEAN MODE нельзя искать по куску слова, что не подходит совсем.