Могу ли я использовать полнотекстовый поиск InnoDB для токенизации документов? - PullRequest
0 голосов
/ 02 февраля 2020

Раньше я думал, что SQL не может обрабатывать неструктурированные данные (например, текст), если мы не напишем некоторые пользовательские функции в C. Однако функция полнотекстового поиска InnoDB, похоже, уже проделала большую часть такой работы.

Согласно https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html, индекс сохраняется в таблицах InnoDB с именем FTS_00000..._00000..._INDEX_?.

. Я попытался запустить SELECT * FROM FTS_00000 ..._ 00000 ..._ INDEX_1 в надежде увидеть токены в каждом документе (возможно, с уже удаленными стоп-словами). Тем не менее, я получил сообщение об ошибке

ERROR 1146 (42S02): Table 'tf.FTS_0000000000000028_0000000000000030_INDEX_1' doesn't exist

, даже если select * from information_schema.INNODB_SYS_TABLES; показывает, что таблица существует.

Кто-нибудь знает, как я мог получить токены каждого документа, который я вставил в полную версию? текстовый индекс? Было бы здорово, если бы я мог получить информацию в следующей схеме данных:

token_id   document_id   count
"apple"    103343        3
"orange"    9593         1
...

1 Ответ

0 голосов
/ 02 февраля 2020

То, что InnoDB использует таблицу как внутреннюю структуру данных, не означает, что у вас есть доступ для запроса этих таблиц FTS с помощью операторов SQL. Они не отображаются в INFORMATION_SCHEMA.TABLES.

После создания таблицы opening_lines, которая является примером, приведенным на этой странице руководства, я вижу это:

mysql> SELECT table_id, name, space FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
    ->        WHERE name LIKE 'test/%';
+----------+----------------------------------------------------+-------+
| table_id | name                                               | space |
+----------+----------------------------------------------------+-------+
|       52 | test/FTS_000000000000002e_0000000000000085_INDEX_1 |    36 |
|       53 | test/FTS_000000000000002e_0000000000000085_INDEX_2 |    37 |
|       54 | test/FTS_000000000000002e_0000000000000085_INDEX_3 |    38 |
|       55 | test/FTS_000000000000002e_0000000000000085_INDEX_4 |    39 |
|       56 | test/FTS_000000000000002e_0000000000000085_INDEX_5 |    40 |
|       57 | test/FTS_000000000000002e_0000000000000085_INDEX_6 |    41 |
|       47 | test/FTS_000000000000002e_BEING_DELETED            |    31 |
|       48 | test/FTS_000000000000002e_BEING_DELETED_CACHE      |    32 |
|       49 | test/FTS_000000000000002e_CONFIG                   |    33 |
|       50 | test/FTS_000000000000002e_DELETED                  |    34 |
|       51 | test/FTS_000000000000002e_DELETED_CACHE            |    35 |
|       46 | test/opening_lines                                 |    30 |
+----------+----------------------------------------------------+-------+
12 rows in set (0.00 sec)

mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test';
+---------------+
| TABLE_NAME    |
+---------------+
| opening_lines |
+---------------+
1 rows in set (0.00 sec)

Насколько я знаете, нет способа напрямую запросить таблицы FTS. Они предназначены только для внутренней реализации полнотекстовой индексации InnoDB.

...