Фрагменты поиска на китайском языке отображаются некорректно

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

Например, я попытался найти 管理员, исходное предложение было таким:

管理人员可见的分类。只有管理员和版主才能阅览主题

Однако в результатах поиска я вижу следующее.

Как видно, отсутствует 可见的, также нет точки , из-за чего предложение разорвано. Кроме того, пропущены 只有, и, 才能. Между словами появляются неожиданные пробелы.

Может кто-нибудь помочь решить эту проблему? Спасибо.

2 лайка

Похоже, что эти отсутствующие символы считаются стоп-словами в китайском языке

(byebug) data = CppjiebaRb.segment(search_data, mode: mode)
["管理人员", "可见", "的", "分类", "。", "只有", "管理员", "和", "版主", "才能", "阅览", "主题"]
(byebug) CppjiebaRb.filter_stop_word(data)
["管理人员", "分类", "管理员", "版主", "阅览", "主题"]
3 лайка

Подождите, так баг в том, что «summary» в результате выглядит странно? А не в том, что есть какая-то функциональная проблема с поиском?

Да, поиск всё ещё работает, просто отображаемый фрагмент не совсем идеален. Для китайского языка поиск обрабатывается немного иначе. Вместо того чтобы игнорировать стоп-слова непосредственно в поисковом запросе, мы полностью исключаем их из поисковых данных.

3 лайка

Спасибо за внимание к этому вопросу.

Это не стоп-слово в китайском языке, это прилагательное, означающее «видимый».

Возможно ли исправить эту проблему (включая все результаты поиска)? Или есть какое-то обходное решение?

Спасибо.

1 лайк

Стоп-слова — это слова, которые встречаются очень часто и снижают эффективность поиска.

Например, в английском языке слово «and» является стоп-словом.

Это можно исправить, но на это потребуется несколько месяцев. Тем временем, если нужно срочно внести исправление, обратитесь в Marketplace.

Отмечаем как pr-welcome.

2 лайка

Стоп-слова определяются с использованием GitHub - yanyiwu/cppjieba: "结巴"中文分词的C++版本 · GitHub. В связи с недавними изменениями в отображении фрагментов поиска, мы должны просто удалить следующую строку, так как она искажает фактические данные поиска.

В любом случае, наша поддержка поиска для китайского языка оставляет желать лучшего, но есть расширения для PostgreSQL, которые мы могли бы рассмотреть, чтобы обеспечить корректную поддержку языков, не имеющих нативной поддержки. Возможно, https://pgroonga.github.io/?

5 лайков

Спасибо! Давайте попробуем и посмотрим, как всё пойдёт.

@tgxworld Не уверен, что правильно понял: PGroonga не поддерживает китайский и японский языки. На https://pgroonga.github.io/ сказано:

PostgreSQL поддерживает полнотекстовый поиск только для языков, использующих только буквы латинского алфавита и цифры. Это означает, что PostgreSQL не поддерживает полнотекстовый поиск для японского, китайского и других подобных языков. Установив PGroonga в ваш PostgreSQL, вы сможете использовать сверхбыструю функцию полнотекстового поиска для всех языков!

@tgxworld Я создал PR по вашему предложению FIX: keep chinese stopwords on search by t0t07 · Pull Request #11530 · discourse/discourse · GitHub

Смысл как раз противоположный. Обычный PostgreSQL не поддерживает китайский и японский языки. PGroonga добавляет поддержку этих языков.

3 лайка

Кстати, @riking, просто для подтверждения: сейчас Discourse реализует полнотекстовый поиск с использованием встроенных функций PostgreSQL, как в discourse/lib/search.rb at 1cf057fb1c4e168ce441ddde918636725abeb668 · discourse/discourse · GitHub

Это верно?

1 лайк

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

1 лайк

@tgxworld Я не понимаю разницы между данными поиска и поисковым запросом. Не могли бы вы предоставить больше подробностей? Спасибо.

Если мы добавим стоп-слова в индекс, это увеличит его размер и ухудшит производительность поиска.

В таблице PostSearchData хранятся два столбца: #search_data используется при запросах по поисковым терминам, а #raw_data — при отображении поискового фрагмента. Исправление должно заключаться в том, чтобы стоп-слова китайского языка не удалялись из #raw_data, но при этом удалялись из #search_data.

Есть ли какие-то новости по этой ошибке?

Я думал, что внес некоторые изменения здесь:

Ваша локаль установлена как zh_TW, zh_CN или ja? Если нет, то включена ли настройка search_tokenize_chinese_japanese_korean?

У нас есть обходной путь здесь:

2 лайка