Relationales MySQL-Datenbankverwaltungssystem
MySQL ist ein kleines relationales Open-Source-Datenbankverwaltungssystem, das von der schwedischen Firma MySQL AB entwickelt wurde. MySQL wird häufig auf kleinen und mittelgroßen Websites im Internet verwendet. Aufgrund der geringen Größe, der hohen Geschwindigkeit, der niedrigen Gesamtbetriebskosten und insbesondere der Eigenschaften von Open Source wählen viele kleine und mittlere Websites MySQL als Website-Datenbank, um die Gesamtbetriebskosten der Website zu senken.
Der Standard-Volltextindex-Parser von InnoDB eignet sich sehr gut für Latein, da Latein Leerzeichen zum Segmentieren von Wörtern verwendet. Für Sprachen wie Chinesisch, Japanisch und Koreanisch gibt es jedoch kein solches Trennzeichen. Ein Wort kann aus mehreren Wörtern bestehen, daher müssen wir auf unterschiedliche Weise damit umgehen. In MySQL 5.7.6 können wir ein neues Volltextindex-Plug-in verwenden, um sie zu verarbeiten: den N-Gramm-Parser.
Vorwort
Tatsächlich wird die Volltextsuche in MySQL schon seit langem unterstützt, jedoch nur Englisch. Der Grund dafür ist, dass er bei der Wortsegmentierung immer Leerzeichen als Trennzeichen verwendet. Für Chinesisch ist die Verwendung von Leerzeichen offensichtlich unangemessen, und die Wortsegmentierung muss auf der chinesischen Semantik basieren. Nein, ab MySQL 5.7 verfügt MySQL über ein integriertes Ngram-Volltextsuch-Plug-in zur Unterstützung der Segmentierung chinesischer Wörter und ist für MyISAM- und InnoDB-Engines wirksam.
Bevor Sie das chinesische Suchwortsegmentierungs-Plug-in ngram verwenden, müssen Sie zunächst seine Wortsegmentierungsgröße in der MySQL-Konfigurationsdatei festlegen.
[mysqld] ngram_token_size=2
Stellen Sie hier die Wortsegmentierung ein Größe auf 2. Denken Sie daran, dass der Index umso größer ist, je größer die Größe der Wortsegmentierung ist. Sie sollten daher die entsprechende Größe entsprechend Ihrer eigenen Situation festlegen.
Beispieltabellenstruktur:
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;
Beispieldaten mit 6 Datensatzzeilen.
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)
Geben Sie explizit die Quelle der Volltextsuchtabelle an
mysql> SETGLOBAL innodb_ft_aux_table="new_feature/articles"; Query OK, 0 rows affected (0.00 sec)
Über die Systemtabelle können Sie sehen, wie die Daten in Artikeln aufgeteilt sind.
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)
Hier können Sie sehen, dass bei einer Wortsegmentierungslänge von 2 alle Daten nur in Zweiergruppen vorliegen. Zu den oben genannten Daten gehören auch Zeilenposition, ID und andere Informationen.
Als nächstes werde ich eine Reihe von Suchdemonstrationen durchführen. Die Verwendungsmethode ist die gleiche wie bei der ursprünglichen englischen Suche.
1. Suche im natürlichen Sprachmodus:
Ermitteln Sie die Anzahl der qualifizierten Elemente,
mysql>SELECT COUNT(*) FROM articles -> WHERE MATCH (title,body) AGAINST ('数据库' IN NATURALLANGUAGE MODE); +----------+ | COUNT(*) | +----------+ | 4 | +----------+ 1 row in set (0.05 sec)
2. Ermitteln Sie das Übereinstimmungsverhältnis >
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)
mysql> SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST ('+数据库 +管理' IN BOOLEAN MODE); +----+------------+--------------------------------------+ | id| title | body | +----+------------+--------------------------------------+ | 1 | 数据库管理 | 在本教程中我将向你展示如何管理数据库 | +----+------------+--------------------------------------+ 1 rowin set (0.00 sec)
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)
mysql> SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST ('>数据库 +MySQL' INBOOLEAN MODE); +----+---------------+-----------------+ | id| title | body | +----+---------------+-----------------+ | 3 | MySQL完全手册 |学习MySQL的一切 | +----+---------------+-----------------+ 1 rowin set (0.00 sec)
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)