>  기사  >  데이터 베이스  >  MySQL 5.7의 중국어 전체 텍스트 검색에 대한 심층 분석

MySQL 5.7의 중국어 전체 텍스트 검색에 대한 심층 분석

黄舟
黄舟원래의
2017-01-18 11:48:211973검색

Mysql 관계형 데이터베이스 관리 시스템

MySQL은 스웨덴 MySQL AB 회사에서 개발한 오픈 소스 소규모 관계형 데이터베이스 관리 시스템입니다. MySQL은 인터넷상의 중소규모 웹사이트에서 널리 사용되고 있습니다. 작은 크기, 빠른 속도, 낮은 총 소유 비용, 특히 오픈 소스의 특성으로 인해 많은 중소 웹 사이트에서는 웹 사이트 총 소유 비용을 줄이기 위해 MySQL을 웹 사이트 데이터베이스로 선택합니다.


InnoDB의 기본 전체 텍스트 인덱스 파서는 라틴어에 매우 적합합니다. 라틴어는 공백을 사용하여 단어를 분할하기 때문입니다. 하지만 중국어, 일본어, 한국어 등의 언어에는 이러한 구분 기호가 없습니다. 한 단어는 여러 단어로 구성될 수 있으므로 이를 다양한 방식으로 처리해야 합니다. MySQL 5.7.6에서는 이를 처리하기 위해 새로운 전체 텍스트 인덱스 플러그인인 n-gram 파서를 사용할 수 있습니다.

머리말

사실 MySQL에서는 오랫동안 전체 텍스트 검색을 지원해 왔지만 지금까지는 영어만 지원했습니다. 그 이유는 단어 분할을 위한 구분 기호로 항상 공백을 사용하기 때문입니다. 중국어의 경우 공백을 사용하는 것은 분명히 부적절하며 단어 분할은 중국어 의미론을 기반으로 해야 합니다. 아니요, MySQL 5.7부터 MySQL에는 중국어 단어 분할을 지원하는 ngram 전체 텍스트 검색 플러그인이 내장되어 있으며 MyISAM 및 InnoDB 엔진에 효과적입니다.

중국어 검색어 분할 플러그인 ngram을 사용하기 전에 먼저 MySQL 구성 파일에서 단어 분할 크기를 설정해야 합니다. 예를 들어

[mysqld]
ngram_token_size=2

여기서 단어 분할 크기는 다음과 같이 설정됩니다. 2. 단어 분할의 SIZE가 클수록 인덱스도 커지므로 상황에 맞게 적절한 크기를 설정해야 한다는 점을 기억하세요.

샘플 테이블 구조:

CREATE TABLE articles (
   id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
   titleVARCHAR(200),
   body TEXT,
   FULLTEXT (title,body) WITH PARSER ngram
  ) ENGINE=InnoDBCHARACTER SET utf8mb4;

6행의 레코드가 있는 샘플 데이터입니다.

mysql> select * from articles\G
***************************1. row ***************************
  id: 1
title: 数据库管理
 body: 在本教程中我将向你展示如何管理数据库
***************************2. row ***************************
  id: 2
title: 数据库应用开发
 body: 学习开发数据库应用程序
***************************3. row ***************************
  id: 3
title: MySQL完全手册
 body: 学习MySQL的一切
***************************4. row ***************************
  id: 4
title: 数据库与事务处理
 body: 系统的学习数据库的事务概论
***************************5. row ***************************
  id: 5
title: NoSQL精髓
 body: 学习了解各种非结构化数据库
***************************6. row ***************************
  id: 6
title: SQL 语言详解
 body: 详细了解如果使用各种SQL
6 rows inset (0.00 sec)

전문 검색 테이블 소스를 명시적으로 지정

mysql> SETGLOBAL innodb_ft_aux_table="new_feature/articles";
Query OK, 0 rows affected (0.00 sec)

시스템 테이블을 통해 기사 내 데이터가 어떻게 구분되는지 확인할 수 있습니다.

mysql> SELECT *FROM information_schema.INNODB_FT_INDEX_CACHE LIMIT 20,10;
+------+--------------+-------------+-----------+--------+----------+
| WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID| POSITION |
+------+--------------+-------------+-----------+--------+----------+
| 中我 |   2 |   2 |   1 |  2 |  28 |
| 习m |   4 |   4 |   1 |  4 |  21 |
| 习了 |   6 |   6 |   1 |  6 |  16 |
| 习开 |   3 |   3 |   1 |  3 |  25 |
| 习数 |   5 |   5 |   1 |  5 |  37 |
| 了解 |   6 |   7 |   2 |  6 |  19 |
| 了解 |   6 |   7 |   2 |  7 |  23 |
| 事务 |   5 |   5 |   1 |  5 |  12 |
| 事务 |   5 |   5 |   1 |  5 |  40 |
| 何管 |   2 |   2 |   1 |  2 |  52 |
+------+--------------+-------------+-----------+--------+----------+
10 rows in set (0.00 sec)

여기서 단어 분할 길이를 2로 설정하면 모든 데이터가 2개의 그룹에만 있음을 알 수 있습니다. 위 데이터에는 행 위치, ID 및 기타 정보도 포함됩니다.

다음으로 일련의 검색 시연을 진행하겠습니다. 사용 방법은 원래 영어 검색과 동일합니다.

1. 자연어 모드로 검색:

1. 적합한 항목 수를 가져옵니다.

mysql>SELECT COUNT(*) FROM articles
-> WHERE MATCH (title,body) AGAINST ('数据库' IN NATURALLANGUAGE MODE);
+----------+
| COUNT(*) |
+----------+
|  4 |
+----------+
1 row in set (0.05 sec)

2. 일치 비율을 가져옵니다.

mysql>SELECT id, MATCH (title,body) AGAINST ('数据库' IN NATURAL LANGUAGE MODE)
 AS score FROM articles;
+----+----------------------+
| id| score    |
+----+----------------------+
| 1 | 0.12403252720832825 |
| 2 | 0.12403252720832825 |
| 3 |     0 |
| 4 | 0.12403252720832825 |
| 5 | 0.062016263604164124|
| 6 |     0 |
+----+----------------------+
6rows in set (0.00 sec)
.

2. 자연 모드 검색보다 복잡한 부울 모드 검색:

1. 관리 및 데이터베이스 모두에서 레코드 일치,

mysql> SELECT * FROM articles WHERE MATCH (title,body)
  ->  AGAINST ('+数据库 +管理' IN BOOLEAN MODE);
+----+------------+--------------------------------------+
| id| title  | body         |
+----+------------+--------------------------------------+
| 1 | 数据库管理 | 在本教程中我将向你展示如何管理数据库  |
+----+------------+--------------------------------------+
1 rowin set (0.00 sec)

2. 데이터베이스 일치 , 관리 기록 없음,

mysql> SELECT * FROM articles WHERE MATCH (title,body)
  ->  AGAINST ('+数据库 -管理' IN BOOLEAN MODE);
+----+------------------+----------------------------+
| id| title    | body      |
+----+------------------+----------------------------+
| 2 | 数据库应用开发  | 学习开发数据库应用程序   |
| 4 | 数据库与事务处理 | 系统的学习数据库的事务概论  |
| 5 | NoSQL 精髓  | 学习了解各种非结构化数据库  |
+----+------------------+----------------------------+
3 rows in set (0.00 sec)

3. MySQL과 일치하지만 데이터베이스의 관련성을 줄임,

mysql> SELECT * FROM articles WHERE MATCH (title,body)
  ->  AGAINST ('>数据库 +MySQL' INBOOLEAN MODE);
+----+---------------+-----------------+
| id| title   | body   |
+----+---------------+-----------------+
| 3 | MySQL完全手册 |学习MySQL的一切 |
+----+---------------+-----------------+
1 rowin set (0.00 sec)


3. 예를 들어 데이터베이스를 검색하려면 MySQL, oracle 및 DB2도 검색됩니다.

mysql> SELECT * FROM articles
  ->  WHERE MATCH (title,body)
  ->  AGAINST ('数据库' WITH QUERY EXPANSION);
+----+------------------+--------------------------------------+
| id| title   | body         |
+----+------------------+--------------------------------------+
| 1 | 数据库管理  | 在本教程中我将向你展示如何管理数据库  |
| 4 | 数据库与事务处理 | 系统的学习数据库的事务概论    |
| 2 | 数据库应用开发  | 学习开发数据库应用程序     |
| 5 | NoSQL 精髓  | 学习了解各种非结构化数据库    |
| 6 | SQL 语言详解  | 详细了解如果使用各种SQL     |
| 3 | MySQL完全手册  | 学习MySQL的一切      |
+----+------------------+--------------------------------------+
6 rows in set (0.01 sec)

물론 여기서는 더 많은 성능 테스트가 가능합니다. .세부적인 테스트가 가능합니다. N-grm은 중국어 검색에 흔히 사용되는 단어 분할 알고리즘으로, 인터넷상에서 널리 사용되어 왔기 때문에, 이번에 MySQL에 통합된다면 효과에는 분명 큰 문제가 없을 것입니다.

이상은 MySQL 5.7의 중국어 전문 검색에 대한 심층 분석입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.