Databases

MySQL 풀텍스트 검색

duraboys 2013. 1. 9. 04:08

풀텍스트 검색은 MyISAM 테이블에서만 가능.

풀텍스트 검색은 UCS-2 에서는 사용할 수 없다 (그러나 ,MySQL 4.1.1 이후에서는 ,UTF-8 그리고 기능한다 ).

MATCH() 함수의 파라미터는 모두 , 같은 FULLTEXT 인덱스의 일부를 이루는 같은 테이블의 컬럼이 아니면 안된다 (IN BOOLEAN MODE 로 MATCH() 를 실행하는 경우를 제외하다 ).

FULLTEXT 인덱스의 컬럼은 모두 같은 캐릭터 세트를 사용하고 있지 않으면 안 된다.

MATCH() 의 컬럼 리스트는 테이블의 일부의 FULLTEXT 인덱스 정의의 컬럼 리스트와 정확하게 일치하고 있지 않으면 안 된다 (IN BOOLEAN MODE 로 MATCH() 를 실행하는 경우를 제외하다 ).

AGAINST() 의 인수는 정수 캐릭터 라인이 아니면 안된다.

MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION] )



MySQL은 IN BOOLEAN MODE 모디파이어를 사용해서 불리안 전문 검색을 실행한다:
mysql> SELECT * FROM articles WHERE MATCH (title,body)
    -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+-----------------------+-------------------------------------+
| id | title                 | body                                |
+----+-----------------------+-------------------------------------+
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...        |
|  2 | How To Use MySQL Well | After you went through a ...        |
|  3 | Optimizing MySQL      | In this tutorial we will show ...   |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ... |
|  6 | MySQL Security        | When configured properly, MySQL ... |
+----+-----------------------+-------------------------------------+
+ 와 – 연산자는 매치가 일어났을 때 존재해야 하거나 또는 존재하지 말아야 하는 단어를 각각 나타낸다. 따라서, 이 쿼리는 단어 “MySQL”는 존재하지만 “YourSQL”은 없는 모든 열을 추출하게 된다.
불리안 전문 검색은 아래와 같은 특징을 가지고 있다:
  • 이 검색은 50% 쓰레드홀드를 사용하지 않는다.
  • 이 검색은 내림 차순 연관도 순서로 열을 자동 정렬하지는 않는다: 가장 높은 연관도를 가지고 있는 열은 “MySQL”을 두 번 가지고 있는 열이지만, 맨 처음이 아니라 맨 나중에 나오게 된다.
  • 이 검색은 비록 검색 속도는 저하되지만 FULLTEXT 인덱스를 사용하지 않아도 동작을 한다.
  • 최소 및 최대 단어 길이 전문 파라미터가 적용된다.
  • 스톱워드 리스트가 적용된다.
불리안 전문 검색 기능은 아래와 같은 연산자를 지원한다:
  • +

이 부호가 단어 앞에 나오면 그 단어는 반드시 리턴되는 각각의 열에 존재해야 한다는 것을 의미한다.

  • -

이 부호가 단어 앞에 나오면 그 단어는 반드시 리턴되는 어떠한 열에도 존재하지 말아야 함을 의미한다.

Note: - 연산자는 다른 검색어에 의해 매치되는 열을 배제하는 기능만 실행한다. 따라서, -연산자가 앞에 있는 검색어만을 갖는 블리안-모드 검색은 그 결과 값이 없게(empty) 된다.

  • (연산자 없음)

디폴트로는 (+ 또는 – 가 지정되지 않을 때) 단어를 넣는 것이 옵션 사항이지만, 단어가 있는 것이 우선 순위가 높게 된다. 이것은 IN BOOLEAN MODE 수정자 (modifier)가 없는 MATCH() ... AGAINST()의 기능을 모방한 것이다.

  • > <

위의 두 연산자는 한 단어의 컨트리뷰션 (contribution)을 특정 열에 할당된 관련 값으로 변경하고자 할 때 사용된다. > 연산자는 컨튜리뷰션을 증가시키며 < 연산자는 그것을 감소시킨다. 아래에 있는 예문을 참조.

  • ( )

괄호는 단어를 그룹화 해서 서브익스프레션 (subexpression)시킨다. 괄호화된 그룹은 네스티드될 수 있다.

  • ~

단어 앞에 나오는 틸데 (tilde) 기호는 부정 연산자와 같이 동작을 하며, 그 단어의 컨트리뷰션이 해당 열과 부정 연관성을 갖도록 만든다. 이 연산자는 “노이즈 (noise)” 단어를 마킹 (marking)하는데 유용하다. 이와 같은 형태의 단어를 가지고 있는 열은 다른 열보다 우선 순위가 낮게 되지만, -연산자처럼 모든 것을 배제하는 것은 아니다.

  • *

별표 연산자는 트런케이션 (truncation) (또는 와잉드카드) 연산자와 유사한 기능을 실행한다. 다른 연산자와는 달리, 이것은 적용 단어 뒤에 표시 한다. 매치되는 단어는 *연산자 앞에 있는 단어와 매치되는 것이 된다.

  • "

이중 인용 구호 연산자는  안에 있는 구문과 동일한 철자의 구문이 있는 열을 매치 시킨다. 전체 문장 엔진 (full-text engine)은 구문을 단어로 분리하고, 각각의 단어에 대해서 FULLTEXT 인덱스 검색을 실행한다.

아래에 있는 예문들은 불리안 전체 문장 (full-text) 연산자를 사용한 검색 스트링의 예를 몇가지 보여 주는 것이다:
  • 'apple banana'

두개의 단어 중에 최소한 한 개의 단어가 있는 열을 찾는다.

  • '+apple +juice'

두 개의 단어 모두가 있는 열을 찾는다.

  • '+apple macintosh'

“apple”이 있는 열을 찾되, 그 열에 “macintosh”가 있으면 그 열을 상위로 랭크 시킨다.

  • '+apple -macintosh'

“apple”는 있지만 “macintosh”는 없는 열을 찾는다.

  • '+apple ~macintosh'

“apple”이 있는 열을 찾되, 그 열에 “macintosh”가 있으면 “macintosh”가 없는 열보다 순위를 아래로 만든다. 이 방식은 '+apple -macintosh'보다 부드러운 방식인데, 그 이유는 “macintosh”의 존재가 아무것도 리턴하지 못하도록 하기 때문이다.

  • '+apple +(>turnover

“apple” 과 “turnover”, 또는 “apple” 과 “strudel” 을 갖고 있는 열을 찾되, “apple turnover”가 “apple strudel”보다 우선 순위를 높게 만든다.

  • 'apple*'

“apple”로 시작되는 단어를 갖고 있는 열을 찾는다.

  • '"some words"'
“some words”라는 문장을 정확히 갖고 있는 열은 찾는다 (예를 들면, “some words of wisdom”은 찾지만 “some noise words”는 아님). 구문을 감싸고 있는 ‘"’ 캐릭터는 구문을 한정하는 연산자 기호라는 점을 기억하자. 이 기호는 검색 스트링 자체를 인용하지는 못한다.