복붙노트

[SQL] 어떤 방법은 전체 텍스트와 같은 이노에 검색을 달성하기 위해

SQL

어떤 방법은 전체 텍스트와 같은 이노에 검색을 달성하기 위해

나는 아주 간단한 쿼리를 가지고 :

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

일부 검색 문자열을 검색하지만, 당신이 볼 수 있듯이, 개별적으로 각각의 문자열을 검색하고 그것은 또한 성능을 위해 좋지 않다합니다.

전체 텍스트-같은 InnoDB의 테이블에 LIKE를 사용하여 검색을 다시 할 수있는 방법이있다. 물론, 나는이를 달성하기 위해 스핑크스 같은 것을 사용할 수 있습니다 알고 있지만 나는 순수한 MySQL의 솔루션을 찾고 있어요.

해결법

  1. ==============================

    1.예를 들어 당신의 InnoDB의 테이블에 인덱스 다시에의 MyISAM 전체 텍스트 테이블을 사용 :

    예를 들어 당신의 InnoDB의 테이블에 인덱스 다시에의 MyISAM 전체 텍스트 테이블을 사용 :

    이노를 사용하여 시스템을 구축 :

    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. ==============================

    2.PHP를 사용하여 쿼리를 생성합니다. 이것은 끔찍한 해킹입니다. 본 후에는 눈에 보이지 않는 수 없습니다 ...

    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;
    

    딕셔너리는 사전 함수

  3. ==============================

    3.InnoDB의 전체 텍스트 검색 (FTS)는 MySQL의 5.6.4 버전에서 마지막으로 사용할 수 있습니다.

    InnoDB의 전체 텍스트 검색 (FTS)는 MySQL의 5.6.4 버전에서 마지막으로 사용할 수 있습니다.

    이 인덱스는 물리적으로 전체 같은 CREATE INDEX 문의 FULLTEXT 절, 경기로 SQL 키워드로 작용하는 InnoDB 테이블, () ... SELECT 문에 반대 구문과 OPTIMIZE TABLE 문으로 표시됩니다. 전체 텍스트 인덱스에서

  4. from https://stackoverflow.com/questions/4732067/any-way-to-achieve-fulltext-like-search-on-innodb by cc-by-sa and MIT license