MySQL 내장 함수를 이용하여 전체 텍스트 검색 기능 실현

MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION])
MySQL은 전체 텍스트 인덱스 및 검색 기능을 지원합니다.MySQL의 전체 텍스트 인덱스 유형 FULLTEXT의 인덱스FULLTEXT 인덱스는 MyISAM 테이블에만 사용할 수 있습니다.CHAR, VARCHAR 또는 TEXT 열에서 CREATE TABLE 문의 일부로 만들거나 나중에 ALTER TABLE 또는 CREATE INDEX를 사용하여 추가할 수 있습니다.비교적 큰 데이터 집합에 대해 당신의 자료를 FULLTEXT 인덱스가 없는 표에 입력한 다음 인덱스를 만듭니다. 그 속도는 자료를 기존의 FULLTEXT 인덱스에 입력하는 속도보다 더 빠릅니다.
전체 텍스트 검색은 MATCH() 함수와 함께 수행됩니다.
mysql> CREATE TABLE articles (
    ->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   title VARCHAR(200),
    ->   body TEXT,
    ->   FULLTEXT (title,body)
    -> );
Query OK, 0 rows affected (0.00 sec)
 
mysql> INSERT INTO articles (title,body) VALUES
    -> ('MySQL Tutorial','DBMS stands for DataBase ...'),
    -> ('How To Use MySQL Well','After you went through a ...'),
    -> ('Optimizing MySQL','In this tutorial we will show ...'),
    -> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    -> ('MySQL vs. YourSQL','In the following database comparison ...'),
    -> ('MySQL Security','When configured properly, MySQL ...');
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM articles
    -> WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

MATCH() 함수는 문자열에 대해 저장소 내의 자연 언어 검색을 수행합니다.저장소는 FULLTEXT에 포함된 열 1개 또는 2개입니다.검색 문자열은 AGAINST()에 대한 매개변수로 지정됩니다.테이블의 각 행에 대해 MATCH () 는 검색 문자열과 MATCH () 테이블에서 지정한 열의 줄 문자 사이의 유사성 도량을 되돌려줍니다.
기본적으로 검색은 대소문자를 구분하지 않고 실행됩니다.그러나, 인덱스에 편입된 열에 대해 대소문자를 구분하는 전문 검색을 2진 정렬로 실행할 수 있다.예를 들어, latin1 문자 세트를 사용하는 열에 latin1 을 지정할 수 있습니다.bin의 정렬 방식, 전체 텍스트 검색에 대해 대소문자를 구분합니다.
위에서 언급한 바와 같이 MATCH()가 WHERE 문에 사용될 때 관련 값은 마이너스 부동점수가 아닙니다.제로 관련은 유사성이 없다는 뜻이다.관련성 계산은 이 줄의 단어 수, 이 줄의 독특한 자 수, 자료 라이브러리의 단어 수, 그리고 특수한 단어를 포함하는 파일(줄) 수를 바탕으로 한다.
자연 언어 전문 검색에 있어서, MATCH () 함수에 명명된 열은 테이블의 FULLTEXT 인덱스에 포함된 열과 같습니다.앞에서 말한 문의에 대해, MATCH () 함수 (제목 및 전문) 에서 명명된 열은 문장표의 FULLTEXT 인덱스에 있는 열과 같다는 것을 주의하십시오.제목과 전문을 각각 검색하려면 열마다 FULLTEXT 인덱스를 만들어야 합니다.
또는 부울 검색을 실행하거나 검색 확장을 사용하여 검색할 수도 있습니다.
위의 예는 기본적으로 되돌아오는 줄의 관련성 순서가 점점 약해지는 MATCH () 함수를 어떻게 사용하는지 보여 준다.아래의 예는 관련 값을 어떻게 명확하게 검색하는지 보여준다.SELECT 문에 WHERE 또는 ORDER BY 자구가 포함되지 않으므로 행이 반환되는 순서는 일정하지 않습니다.
mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial')
-> FROM articles;
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
|  1 |                        0.65545833110809 |
|  2 |                                       0 |
|  3 |                        0.66266459226608 |
|  4 |                                       0 |
|  5 |                                       0 |
|  6 |                                       0 |
+----+-----------------------------------------+
6 rows in set (0.00 sec)

아래의 예는 더욱 복잡하다.문의는 관련 값을 되돌려주고 줄을 관련성이 점점 약해지는 순서에 따라 정렬합니다.이 결과를 실현하기 위해서는 MATCH () 를 두 번 지정해야 합니다. 한 번은 SELECT 목록에 있고, 다른 한 번은 WHERE 자구에 있습니다.MySQL 최적화 프로그램은 두 개의 MATCH () 호출이 동일하다는 것을 알아차리고 전문 검색 코드를 한 번만 활성화하기 때문에 추가 내무 작업을 일으키지 않습니다.
mysql> SELECT id, body, MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root') AS score
-> FROM articles WHERE MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)

테이블에 2행(0.00초)
MySQL FULLTEXT 실행은 단어로 단어의 원래 형태(문자, 숫자 및 밑줄 부분) 시퀀스를 표시합니다.이 서열에는 작은 따옴표 (') 도 포함될 수 있지만, 한 줄에 하나를 넘지 않습니다.이것은 aaa'bb는 하나의 단어로 간주되고, aa'bbb는 두 개의 단어로 간주된다는 것을 의미한다.단어 앞이나 뒤에 있는 작은 따옴표는 FULLTEXT 분석 프로그램에서 삭제됩니다."aaa'bb'가 aa'bb가 될 거예요.
FULLTEXT 분석 프로그램은 단어의 시작 위치와 끝 위치를 구분할 수 있습니다. 예를 들어 '(간격 기호), (쉼표), 그리고.마침표.만약 단어가 분리된 문자가 없다면, (예를 들어 중국어에서) FULLTEXT 분석 프로그램은 한 단어의 시작 위치와 끝 위치를 확정할 수 없다.이러한 언어에서 FULLTEXT 인덱스에 단어나 다른 인덱스 용어를 추가할 수 있도록, '와 같은 임의의 구분자에 의해 분리되도록 미리 처리해야 한다.
일부 단어는 전체 텍스트 검색에서 무시됩니다.
◆너무 짧은 단어는 모두 무시된다.전체 텍스트 검색에서 찾을 수 있는 단어의 기본 최소 길이는 4글자입니다.
◆ 글자를 멈추는 단어는 무시된다.금지어는'the'나'some'처럼 너무 평범하고 의미가 없는 단어로 여겨진다.내장된 정지자가 존재하지만 사용자 정의 목록을 통해 바꿀 수 있습니다.
라이브러리와 질문의 모든 정확한 단어는 라이브러리와 질문의 중요성에 따라 평가된다.이런 방식을 통해 많은 파일에 나타난 단어는 비교적 낮은 중요성을 가진다(그리고 심지어 많은 단어의 중요성은 0이다). 왜냐하면 이 특별 어구에서 의미 가치가 비교적 낮기 때문이다.반대로, 만약 이 단어가 비교적 드물다면, 그것은 비교적 높은 중요성을 얻게 될 것이다.그리고 단어의 중요성이 조합되어 이 줄의 상관성을 계산하는 데 쓰인다.
이 기술은 대형 어구와 함께 사용하기에 가장 적합하다.아주 작은 표에 대해 단어의 분포는 그들의 의미 가치를 충분히 반영하지 못하는데 이 모델은 때때로 기이한 결과를 초래할 수 있다.예를 들어, "MySQL"이라는 단어가 기사 테이블의 각 행에 표시되지만 이 단어에 대한 검색은 결과를 얻지 못할 수 있습니다.
mysql> SELECT * FROM articles
-> WHERE MATCH (title,body) AGAINST ('MySQL');

검색어를 찾을 수 없음(0.00초)
이 검색 결과는 'MySQL' 이라는 단어가 최소한 전문의 50% 줄에 나타나기 때문에 비어 있습니다.그래서 정지자에 들어간다.대형 데이터 세트에 대해 이 조작을 사용하는 것이 가장 적합하다. 자연 언어의 문의는 1GB 테이블에서 한 줄마다 한 번씩 되돌아오지 않는다.소형 데이터 집합의 용도는 비교적 작을 수 있다.
표의 모든 줄의 내용에 부합되는 단어의 절반이 관련 문서를 찾을 가능성이 적다.사실 그것은 상관없는 많은 내용을 쉽게 찾을 수 있다.우리가 인터넷에서 검색엔진을 이용해 자료를 찾으려고 시도할 때 이런 상황이 발생하는 빈도가 매우 높다는 것을 우리는 모두 알고 있다.이 단어를 포함하는 줄은 그 소재의 특별 데이터 집합으로 인해 비교적 낮은 의미 가치를 부여받았다고 추론할 수 있다.주어진 단어는 한 데이터 집합에서 50% 가 넘는 역값을 가질 수 있지만, 다른 데이터 집합에서는 그렇지 않다.
전체 텍스트 검색을 처음 사용해서 작업 과정을 이해하려고 시도할 때, 이 50%의 필드 값은 중요한 내포된 동작을 제공합니다. 만약 표를 만들고 문장의 1, 2줄만 삽입한다면, 문장의 모든 단어가 모든 줄에 나타날 확률은 적어도 50% 입니다.그럼 결국 너는 아무것도 찾지 못할 거야.최소한 세 줄을 삽입하고 많으면 많을수록 좋다.이 50% 범위를 벗어나야 하는 사용자는 4부울 검색코드.

좋은 웹페이지 즐겨찾기