2011-01-19 12 views
2

の全文のような検索を実現するために、任意の方法、私は非常に単純なクエリがあります:some search stringを検索するためにInnoDBの

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

を、しかし、あなたが見ることができるように、それは個々の文字列を検索し、それはまたのために良いではありませんパフォーマンス。

InnoDBテーブルでLIKEを使用して全文検索を再作成する方法はありますか?もちろん、私はこれを達成するためにSphinxのようなものを使うことができますが、私は純粋なMySQLソリューションを探しています。

+0

innodbはフルテキスト検索をサポートしていません... – ajreal

+3

非常にありがとうございました。あなたに非常に感謝しています:) – steve

答えて

6

は、例えば、バックあなたのInnoDBテーブルへのインデックスへのMyISAM全文テーブルを使用した辞書機能です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テーブルにインデックスを戻すために使用するフルテキスト検索テーブルです。このことができます

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'); 

希望:あなたは、あなたのPHP /アプリケーションから呼び出す検索ストアドプロシージャ最後に

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; 

などのトリガーや夜間のバッチ更新を使用するか、このテーブルの行を維持することができます)

2

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; 

辞書は

+0

恐ろしいハック? PHPの路地を騒がせます。 –