Любой способ добиться полнотекстового поиска в InnoDB - PullRequest
2 голосов
/ 19 января 2011

У меня очень простой запрос:

SELECT ... WHERE row LIKE '%some%' OR row LIKE '%search%' OR  row LIKE '%string%'

для поиска some search string, но, как вы можете видеть, он ищет каждую строку в отдельности, а также не влияет на производительность.

Есть ли способ воссоздать полнотекстовый поиск, используя LIKE для таблицы InnoDB.Конечно, я знаю, что могу использовать что-то вроде Sphinx для достижения этой цели, но я ищу чистое решение MySQL.

Ответы [ 3 ]

7 голосов
/ 19 января 2011

используйте полнотекстовую таблицу myisam для индексации в ваших таблицах innodb, например:

Создайте свою систему, используя innodb:

create table users (...) engine=innodb;

create table forums (...) engine=innodb;

create table threads
(
forum_id smallint unsigned not null,
thread_id int unsigned not null default 0,
user_id int unsigned not null,
subject varchar(255) not null, -- gonna want to search this... !!
created_date datetime not null,
next_reply_id int unsigned not null default 0,
view_count int unsigned not null default 0,
primary key (forum_id, thread_id) -- composite clustered PK index
)
engine=innodb;

Теперь таблица полнотекстового поиска, которую мы будем использовать для индексации наших таблиц innodb. Вы можете поддерживать строки в этой таблице, используя триггер или ночные пакетные обновления и т. Д.

create table threads_ft
(
forum_id smallint unsigned not null,
thread_id int unsigned not null default 0,
subject varchar(255) not null,
fulltext (subject), -- fulltext index on subject
primary key (forum_id, thread_id) -- composite non-clustered index 
)
engine=myisam;

Наконец, поисковая хранимая процедура, которую вы вызываете из вашего php / приложения:

drop procedure if exists ft_search_threads;
delimiter #

create procedure ft_search_threads
(
in p_search varchar(255)
)
begin

select
 t.*,
 f.title as forum_title,
 u.username,
 match(tft.subject) against (p_search in boolean mode) as rank
from
 threads_ft tft
inner join threads t on tft.forum_id = t.forum_id and tft.thread_id = t.thread_id
inner join forums f on t.forum_id = f.forum_id
inner join users u on t.user_id = u.user_id
where
 match(tft.subject) against (p_search in boolean mode) 
order by 
 rank desc
limit 100;

end;

call ft_search_threads('+innodb +clustered +index');

Надеюсь, это поможет:)

2 голосов
/ 19 января 2011

Использование PHP для построения запроса.Это ужасный хак.Однажды увиденное, его нельзя увидеть ...

$words=dict($userQuery);
$numwords = sizeof($words);
$innerquery="";
for($i=0;$i<$numwords;$i++) {
    $words[$i] = mysql_real_escape_string($words[$i]);
    if($i>0) $innerquery .= " AND ";
    $innerquery .= "
        (
            field1 LIKE \"%$words[$i]%\" OR
            field2 LIKE \"%$words[$i]%\" OR
            field3 LIKE \"%$words[$i]%\" OR
            field4 LIKE \"%$words[$i]%\"
        )
    ";
}


SELECT fields FROM table WHERE $innerquery AND whatever;

dict - функция словаря

1 голос
/ 13 мая 2013

Полнотекстовый поиск InnoDB (FTS) наконец-то доступен в выпуске MySQL 5.6.4.

Эти индексы физически представлены как целые таблицы InnoDB, на которые действуют ключевые слова SQL, такие как предложение FULLTEXT оператора CREATE INDEX, синтаксис MATCH () ... AGAINST в операторе SELECT и оператор OPTIMIZE TABLE , От FULLTEXT индексы

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