[SQL] 어떤 방법은 전체 텍스트와 같은 이노에 검색을 달성하기 위해
SQL어떤 방법은 전체 텍스트와 같은 이노에 검색을 달성하기 위해
나는 아주 간단한 쿼리를 가지고 :
SELECT ... WHERE row LIKE '%some%' OR row LIKE '%search%' OR row LIKE '%string%'
일부 검색 문자열을 검색하지만, 당신이 볼 수 있듯이, 개별적으로 각각의 문자열을 검색하고 그것은 또한 성능을 위해 좋지 않다합니다.
전체 텍스트-같은 InnoDB의 테이블에 LIKE를 사용하여 검색을 다시 할 수있는 방법이있다. 물론, 나는이를 달성하기 위해 스핑크스 같은 것을 사용할 수 있습니다 알고 있지만 나는 순수한 MySQL의 솔루션을 찾고 있어요.
해결법
-
==============================
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.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.InnoDB의 전체 텍스트 검색 (FTS)는 MySQL의 5.6.4 버전에서 마지막으로 사용할 수 있습니다.
InnoDB의 전체 텍스트 검색 (FTS)는 MySQL의 5.6.4 버전에서 마지막으로 사용할 수 있습니다.
이 인덱스는 물리적으로 전체 같은 CREATE INDEX 문의 FULLTEXT 절, 경기로 SQL 키워드로 작용하는 InnoDB 테이블, () ... SELECT 문에 반대 구문과 OPTIMIZE TABLE 문으로 표시됩니다. 전체 텍스트 인덱스에서
from https://stackoverflow.com/questions/4732067/any-way-to-achieve-fulltext-like-search-on-innodb by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 MySQL의 날짜 격차를 채우기 위해? (0) | 2020.05.05 |
---|---|
[SQL] 오라클 SQL은 - 연속 값 범위를 확인 (0) | 2020.05.05 |
[SQL] MySQL의 피벗 테이블의 열 데이터 행으로 (0) | 2020.05.05 |
[SQL] 어떻게 오라클에서 일정 테이블을 채우는? (0) | 2020.05.05 |
[SQL] 이유는 다음 SELECT 표현에 열 별칭을 사용할 수 없습니다? (0) | 2020.05.05 |