sql >> データベース >  >> RDS >> Mysql

InnoDBでフルテキストのような検索を実現する方法

    たとえば、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 / applicationから呼び出すストアドプロシージャを検索します:

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

    これがお役に立てば幸いです:)



    1. SUBDATE()の例– MySQL

    2. XMLをパラメータとしてOracleのストアドプロシージャに渡す方法

    3. PostgreSQLの日付から月の名前を取得する

    4. DBスキーマの変更を追跡するためのメカニズム