Extraits de recherche chinois semblent cassés

Lorsque j’essaie de rechercher du chinois dans mon forum, je constate que les résultats de recherche affichent des phrases incomplètes : la ponctuation manque, il y a des espaces inattendus entre les mots, et certains mots sont absents.

Par exemple, j’ai essayé de rechercher 管理员. La phrase originale est :

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

Mais ce que j’ai vu dans les résultats de recherche ressemble à ceci :

Comme vous pouvez le constater, 可见的 manque, le point final est également absent, ce qui rompt la phrase. Ensuite, 只有, et 才能 sont aussi manquants. De plus, il y a des espaces inattendus entre les mots.

Quelqu’un peut-il m’aider à résoudre ce problème ? Merci

2 « J'aime »

Il semble que ces caractères manquants soient considérés comme des mots vides en chinois

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

Attends, alors le bug ici, c’est que le « résumé » dans le résultat a l’air bizarre ? Pas qu’il y ait un problème fonctionnel réel avec la recherche ?

Oui, la recherche fonctionne toujours, mais l’extrait affiché n’est pas idéal. Pour la langue chinoise, la recherche est gérée différemment. Au lieu d’ignorer les mots vides lors de la requête de recherche elle-même, nous les excluons complètement des données de recherche.

3 « J'aime »

Merci d’avoir examiné cela.

Ce n’est pas un mot vide en chinois ; c’est un adjectif qui signifie « visible ».

Est-il possible de corriger ce problème (y compris tous les éléments dans les résultats de recherche) ? Ou existe-t-il une solution de contournement ?

Merci.

1 « J'aime »

Les mots vides désignent des termes très courants qui nuisent aux performances de la recherche.

« Et », par exemple, est un mot vide en anglais.

Il est possible de corriger ce problème, mais cela prendra quelques mois. En attendant, si vous avez besoin d’une solution rapide, consultez Marketplace.

Marqué comme pr-welcome.

2 « J'aime »

Les mots vides sont déterminés à l’aide de GitHub - yanyiwu/cppjieba: "结巴"中文分词的C++版本 · GitHub. Avec les récentes modifications concernant l’affichage des extraits de recherche, nous devrions simplement supprimer la ligne suivante, car elle perturbe les données de recherche réelles.

De toute façon, notre prise en charge de la recherche en chinois n’est pas excellente, mais il existe des extensions PG que nous pourrions envisager afin de prendre correctement en charge les langues qui ne bénéficient pas d’une prise en charge native. Peut-être https://pgroonga.github.io/ ?

5 « J'aime »

Merci ! Laissez-moi essayer cela et voir comment cela se passe.

@tgxworld Je ne suis pas sûr de bien comprendre : PGroonga ne prend pas en charge le chinois et le japonais. Sur https://pgroonga.github.io/, il est indiqué :

PostgreSQL prend en charge la recherche plein texte uniquement pour les langues utilisant l’alphabet et les chiffres. Cela signifie que PostgreSQL ne prend pas en charge la recherche plein texte pour le japonais, le chinois, etc. Vous pouvez utiliser la fonctionnalité de recherche plein texte ultra-rapide pour toutes les langues en installant PGroonga dans votre PostgreSQL !

@tgxworld J’ai créé une PR comme vous l’avez suggéré FIX: keep chinese stopwords on search by t0t07 · Pull Request #11530 · discourse/discourse · GitHub

Le sens est exactement le contraire. PostgreSQL normal ne prend pas en charge le chinois et le japonais. PGroonga ajoute la prise en charge de ces langues.

3 « J'aime »

Au fait @riking, juste pour confirmer, actuellement Discourse implémente la recherche plein texte en utilisant les fonctions intégrées de PostgreSQL comme dans discourse/lib/search.rb at 1cf057fb1c4e168ce441ddde918636725abeb668 · discourse/discourse · GitHub

Est-ce exact ?

1 « J'aime »

Désolé de ne pas avoir été plus précis plus tôt. Si nous voulons vraiment corriger cela pour le moment, nous devons nous assurer de ne pas supprimer les mots vides chinois dans les données de recherche, tout en veillant à ce que les mots vides soient toujours supprimés lorsqu’ils sont utilisés comme requête de recherche.

1 « J'aime »

@tgxworld Je ne comprends pas la différence entre les données de recherche et la requête de recherche. Pourriez-vous fournir plus de détails ? Merci.

Si nous ajoutons des mots vides à l’index, cela alourdit l’index et dégrade les performances de recherche.

Nous stockons deux colonnes dans la table PostSearchData : #search_data est utilisé lors des requêtes sur les termes de recherche, tandis que #raw_data est utilisé pour afficher l’extrait de recherche. La correction consiste à ce que les mots vides chinois ne soient pas supprimés de #raw_data, tout en continuant à l’être de #search_data.

Des progrès sur ce bug ?

J’avais cru avoir apporté des modifications ici :

Votre locale est-il défini sur zh_TW, zh_CN ou ja ? Sinon, l’option search_tokenize_chinese_japanese_korean est-elle activée (valeur true) ?

Nous avons une solution de contournement ici :

2 « J'aime »