В MySQL 5.7 отсутствует совпадение со словами из двух китайских символов

Таблица ТБ:

title                       keywords
企业贷款,该如何看懂银行流水     出口退税,贷款,现金流量表,利润表
最高人民法院关于审理民间        企业贷款,合同法,贷款
中国宏观经济数据点评           企业贷款,贷款

ngram_token_size=2
FULLTEXT INDEX `keywords_title`(`keywords`, `title`)

Теперь я сопоставляю ключевые слова и заголовок со словом из четырех китайских символов "character 企业"

select * from tb where MATCH (keywords, title) AGAINST ('企业贷款');

|[
title                       keywords
企业贷款,该如何看懂银行流水     出口退税,贷款,现金流量表,利润表
最高人民法院关于审理民间        企业贷款,合同法,贷款
中国宏观经济数据点评           企业贷款,贷款
]|

Но когда я сопоставляю их со словом с двумя китайскими иероглифами "no", результат не совпадает.

select * from tb where MATCH (keywords, title) AGAINST ('贷款');
|[
]|

3 ответа

Документ MYSQL объясняет назначение полнотекстового синтаксического анализатора ngram.

Встроенный полнотекстовый синтаксический анализатор MySQL использует пробелы между словами в качестве разделителя, чтобы определить, где слова начинаются и заканчиваются, что является ограничением при работе с идеографическими языками, не использующими разделители слов. Чтобы устранить это ограничение , MySQL предоставляет полнотекстовый синтаксический анализатор ngram, который поддерживает китайский, японский и корейский языки (CJK).

ngram_token_size=2(значение по умолчанию) позволяет вам искать 2-символьные китайские слова в вашем случае.

/*!70000 WITH PARSER ngram означает, что версия MySQL >= 7.0.0 выполняет его. FTS был представлен в mysql 5.6, поэтому/*!50600 WITH PARSER нграмм */должно быть достаточно.

ALTER TABLE tb
DROP INDEX `keywords_title ` ,
ADD FULLTEXT INDEX `keywords_title ` (`keywords` ASC, `title` ASC)  /*!70000 WITH PARSER `ngram` */ 

/*!70000 WITH PARSERNgram*/ является необходимым!

/*!70000 WITH PARSER ngram*/  

Это означает, что синтаксис будет выполняться только при версии MySQL>= 7.0.0, поэтому вы вообще не использовали анализатор ngram.

По моему совету вам все еще нужно использовать синтаксический анализатор ngram, потому что полнотекстовый анализатор по умолчанию не может хорошо обрабатывать китайскую строку (это также упоминается в документе).

Я провел несколько тестов на сервере MySQL 5.7 и 8.0 и получил те же результаты:

Для MyISAM

X: return empty result  O: return rows contain the pattern

built-in parser
  IN NATURAL LANGUAGE MODE (default)
    企业贷款    X
    贷款        X
  IN BOOLEAN MODE
    企业贷款    O
    贷款        X

ngram
  IN NATURAL LANGUAGE MODE (default)
    企业贷款    X
    贷款        X
  IN BOOLEAN MODE
    企业贷款    O
    贷款        O

Для InnoDB

built-in parser
  IN NATURAL LANGUAGE MODE (default)
    企业贷款    O
    贷款        X
  IN BOOLEAN MODE
    企业贷款    O
    贷款        X
ngram
  IN NATURAL LANGUAGE MODE (default)
    企业贷款    O
    贷款        O
  IN BOOLEAN MODE
    企业贷款    O
    贷款        O

Во-первых, если вы выполняете поиск в режиме естественного языка, в движке MyISAM есть порог 50%. Обе 企业贷款 а также 贷款 В более чем половине строк MySQL будет рассматривать их как стоп-слова ( doc), поэтому ничего не возвращает.

Далее, если вы используете встроенный анализатор, это приводит к странным результатам, так как анализатор не может хорошо обрабатывать эти идеографические языки.

Есть две причины вашей ситуации:

  1. В отличие от ngram, встроенный синтаксический анализатор может использовать только некоторые символы (в данном случае это запятая) для анализа предложения на китайском языке. Парсер только ловит 企业贷款 токен и не ловит его подстроку 贷款,
  2. Встроенный парсер обрабатывает китайский токен так же, как и английский токен. Длина 贷款 меньше минимальной длины слова, которое считается индексировать (проверьте ft_min_word_len настройка для MyISAM, innodb_ft_min_token_size для InnoDB), поэтому он не будет проиндексирован, хотя 贷款 происходит в keywords поле много раз.
Другие вопросы по тегам