Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Создал таблицу со страницами:
Отредактированно Slorvengo (22.10.2014 22:08:54)
Неактивен
Я понял, что Вы хотите сделать, но так, скорее всего, работать не будет. Причин
как минимум две:
1. MySQL для выборки использует только один индекс. Он может использовать
несколько, но это дорогостоящая операция. Скорее всего, не будет использовать
вообще.
2. MATCH по нескольким полям достаточно хитрый, и сам сортирует сразу по
релевантности. Т.е. дополнительный ORDER будет делать filesort по всему объему
данных, что тоже нехорошо.
BOOLEAN MODE — это исключительно вопрос пристрастий. Если у Вас в :1 может
оказаться бинарный запрос, то он нужен. Если нет — скорее всего, нет.
http://dev.mysql.com/doc/refman/5.6/en/ … olean.html
Теперь что делать. Простой способ — сделать один индекс над нужными полями
и делать один MATCH без ORDER. Плюсы — очевидная и простая схема, встроенная
сортировка, быстрая выборка. Минусы — нельзя сделать разные веса для разных
полей.
Более сложный способ — использовать другое полнотекстовое решение. Например,
для этого часто используют Sphinx. Плюсы — простая схема с разными весами для
разных полей (http://sphinxsearch.com/docs/current.ht … eldweights).
Минусы — отдельный демон с отдельным индексатором.
Неактивен
Спасибо за ответ.
Но как не странно, эта конструкция у меня заработала.
Если запрос меньше 4-ех симвлово поиск идет только по заголовкам страниц:
SELECT info_page_title,info_page_url FROM tx_spiderindexing_content WHERE ( info_page_title LIKE 'г%' OR info_page_meta_description LIKE 'г%' OR info_page_meta_keywords LIKE 'г%' ) AND tx_spiderindexing_content.deleted=0 AND tx_spiderindexing_content.hidden=0 LIMIT 7 ;
Если запрос больше четырех символов - полнотекстовый поиск:
SELECT info_page_title,info_page_url, ( MATCH(info_page_title) AGAINST(:1 IN BOOLEAN MODE) * 10 + MATCH(info_page_meta_keywords) AGAINST(:1 IN BOOLEAN MODE) * 7 + MATCH(info_page_meta_description) AGAINST(:1 IN BOOLEAN MODE) * 5 + MATCH(info_page_content) AGAINST(:1 IN BOOLEAN MODE) ) AS `relev` FROM tx_spiderindexing_content WHERE ( MATCH(`info_page_title`) AGAINST(:1 IN BOOLEAN MODE) OR MATCH(`info_page_meta_keywords`) AGAINST(:1 IN BOOLEAN MODE) OR MATCH(`info_page_meta_description`) AGAINST(:1 IN BOOLEAN MODE) OR MATCH(`info_page_content`) AGAINST(:1 IN BOOLEAN MODE) ) AND hidden = 0 AND deleted=0 ORDER BY `relev` DESC LIMIT 7
Неактивен
Хорошо, что заработала
А explain покажите? Делает index merge на or или использует один индекс?
Неактивен
Кол-во записей в таблице пока до 100.
http://hostingkartinok.com/show-image.p … c2a5e0d5c9
Неактивен
Данный запрос-то адекватным получается?
И имеет ли смысл индекс по полям из четырех колонок группировать в один?
Неактивен
Ну, он не использует индексы, но реализует нужную логику. Если производительности
хватает, то да, получается адекватным
Можете попробовать сгруппировать в один. Если индекс подхватится, то будете выбирать
только нужные данные (но сортировать всё равно в памяти).
Неактивен
Спасибо за ответы.
В общем работает - решил оставить 4 индекса.
Даже вроде живой поиск работает.
Если интересно потестить запрос можно посмотреть:
http://typo3developer.org/
Отредактированно Slorvengo (20.11.2014 23:14:55)
Неактивен