SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.10.2014 22:08:04

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Полнотекстовый поиск по сайту

Добрый день.

Создал таблицу со страницами:



#
# Table structure for table 'page'
#
CREATE TABLE page (

    uid int(11) NOT NULL auto_increment,
    pid int(11) DEFAULT '0' NOT NULL,
deleted tinyint(4) DEFAULT '0' NOT NULL,
    hidden tinyint(4) DEFAULT '0' NOT NULL,
   
    info_page_url_md5                        tinytext,
    info_page_url                            tinytext,
    info_page_title                         varchar(255) DEFAULT '0',
    info_page_meta_keywords                 varchar(255) DEFAULT '0',
    info_page_meta_description                 text,
    info_page_content                         text,
   
    FULLTEXT info_page_title (info_page_title),
    FULLTEXT info_page_meta_keywords (info_page_meta_keywords),
    FULLTEXT info_page_meta_description (info_page_meta_description),
    FULLTEXT info_page_content (info_page_content),
   
    PRIMARY KEY (uid),
    KEY parent (pid)
   
) ENGINE=MyISAM;

 


И делаю следующий запрос на полнотекстовый поиск:


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_se_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

 


В полнотекстовом поиске новичек - и хотелось бы понять, насколько правильно мною составлен запрос для полнотекстового поиска и хотелось бы понять - нужен ли  IN BOOLEAN MODE, можно ли обходится без него и как лучше сделать?

Спасибо.

Отредактированно Slorvengo (22.10.2014 22:08:54)

Неактивен

 

#2 24.10.2014 21:50:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Полнотекстовый поиск по сайту

Я понял, что Вы хотите сделать, но так, скорее всего, работать не будет. Причин
как минимум две:

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).
Минусы — отдельный демон с отдельным индексатором.

Неактивен

 

#3 13.11.2014 11:47:43

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Re: Полнотекстовый поиск по сайту

Спасибо за ответ.
Но как не странно, эта конструкция у меня заработала.

Если запрос меньше 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

Неактивен

 

#4 13.11.2014 14:00:12

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Полнотекстовый поиск по сайту

Хорошо, что заработала smile

А explain покажите? Делает index merge на or или использует один индекс?

Неактивен

 

#5 14.11.2014 09:33:10

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Re: Полнотекстовый поиск по сайту

Кол-во записей в таблице пока до 100.
http://hostingkartinok.com/show-image.p … c2a5e0d5c9

Неактивен

 

#6 15.11.2014 21:07:26

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Re: Полнотекстовый поиск по сайту

Данный запрос-то адекватным получается?
И имеет ли смысл индекс по полям из четырех колонок группировать в один?

Неактивен

 

#7 16.11.2014 15:00:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Полнотекстовый поиск по сайту

Ну, он не использует индексы, но реализует нужную логику. Если производительности
хватает, то да, получается адекватным smile

Можете попробовать сгруппировать в один. Если индекс подхватится, то будете выбирать
только нужные данные (но сортировать всё равно в памяти).

Неактивен

 

#8 20.11.2014 23:13:54

Slorvengo
Завсегдатай
Зарегистрирован: 08.08.2013
Сообщений: 46

Re: Полнотекстовый поиск по сайту

Спасибо за ответы.
В общем работает - решил оставить 4 индекса.
Даже вроде живой поиск работает.

Если интересно потестить запрос можно посмотреть:
http://typo3developer.org/

Отредактированно Slorvengo (20.11.2014 23:14:55)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson