L'extension zhparser active la recherche en texte intégral pour le chinois sur ApsaraDB RDS for PostgreSQL. Contrairement à l'anglais, le texte chinois ne comporte pas d'espaces entre les mots ; l'analyseur intégré de PostgreSQL ne peut donc pas le segmenter correctement. zhparser segmente le texte chinois selon la sémantique, permettant une indexation et une recherche en texte intégral précises.
Prérequis
Avant de commencer, assurez-vous que :
L'instance RDS exécute PostgreSQL 10 ou une version ultérieure.
La version mineure du moteur est 20230830 ou ultérieure. Pour PostgreSQL 17, la version mineure du moteur doit être 20241030 ou ultérieure.
zhparserest ajouté au paramètreshared_preload_librariesde l'instance. Pour plus d'instructions, consultez la rubrique Modifier les paramètres d'une instance ApsaraDB RDS for PostgreSQL.
Les extensions nouvelles ou recréées nécessitent la version mineure du moteur 20230830 ou ultérieure. Si votre instance exécute une version antérieure, mettez-la à jour avant de créer l'extension. Consultez la rubrique Mettre à jour la version mineure du moteur. Si l'extension est déjà installée sur une version antérieure, elle continue de fonctionner. Pour plus d'informations, consultez la page [[Modifications de produit/Modifications de fonctionnalités] Limites relatives à la création d'extensions pour les instances ApsaraDB RDS for PostgreSQL](https://www.alibabacloud.com/help/en/rds/apsaradb-rds-for-postgresql/limits-on-the-creation-of-the-pg-cron-extension).
Activer zhparser
Exécutez les instructions suivantes pour créer l'extension et configurer une configuration de recherche textuelle nommée testzhcfg :
CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
-- Optional: enable short-word compounding for more granular segmentation
ALTER ROLE CURRENT_ROLE SET zhparser.multi_short=on;
La ligne ADD MAPPING FOR n,v,a,i,e,l associe six types de jetons principaux (n, v, a, i, e, l) au dictionnaire simple.
Vérifier la segmentation
La recherche en texte intégral de PostgreSQL repose sur trois fonctions clés :
| Fonction | Objectif | Exemple d'entrée → sortie |
|---|---|---|
ts_parse() |
Renvoie la sortie brute des jetons avec les ID de type de jeton | Jetons bruts issus de l'analyseur |
to_tsvector() |
Convertit le texte en lexèmes normalisés pour l'indexation | Texte → liste de lexèmes indexés |
to_tsquery() |
Convertit une expression en requête | Expression → requête pour la mise en correspondance avec un tsvector |
Pour vérifier que zhparser segmente correctement le texte, exécutez les requêtes de test suivantes :
-- Test raw token output
-- Returns a (tokid, token) result set, where tokid identifies the token type
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动,从中央到地方纷纷加大 了 保 障 房 的 建 设 和 投 入 力 度 。 2011年,保障房进入了更大规模的建设阶段。 住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,要继续推进保障性安居工程建设。 ');
-- Convert text to a tsvector (normalized lexeme list used for indexing)
SELECT to_tsvector('testzhcfg','"今年保障房新开工数量虽然有所下调,但实际的年度在建规模以及竣工规模会超以往年份,相对应的对资金的需求也会创历史纪录。"陈国强说。 在他看来,与2011年相比,2012年的保障房建设在资金配套上的压力将更为严峻。 ');
-- Convert a search phrase to a tsquery for use with the @@ operator
SELECT to_tsquery('testzhcfg', '保障房资金压力');
Créer un index en texte intégral et exécuter des requêtes
Après avoir activé zhparser, créez un index GIN (Generalized Inverted Index) sur la colonne à rechercher. L'exemple suivant crée un index en texte intégral sur la colonne name de la table t1 :
-- Replace t1 and name with your actual table name and column name
CREATE INDEX idx_t1 ON t1 USING gin (to_tsvector('testzhcfg', upper(name)));
Utilisez l'opérateur @@ pour faire correspondre les lignes à une requête de recherche :
SELECT * FROM t1 WHERE to_tsvector('testzhcfg', upper(t1.name)) @@ to_tsquery('testzhcfg', '(防火)');
L'index et la clause WHERE doivent utiliser la même expression — to_tsvector('testzhcfg', upper(name)) — afin que PostgreSQL puisse utiliser l'index lors de l'exécution de la requête.
Ajouter des segments de mots personnalisés
Pour ajouter des termes spécifiques à un domaine que le dictionnaire intégré ne segmente pas correctement, insérez-les dans pg_ts_custom_word.
L'exemple suivant ajoute 保障房资 en tant que segment de mot unique :
-- Check the current segmentation result
SELECT to_tsquery('testzhcfg', '保障房资金压力');
-- Add the new word segment
INSERT INTO pg_ts_custom_word VALUES ('保障房资');
-- Sync the dictionary to apply the change
SELECT zhprs_sync_dict_xdb();
-- Reconnect to the database (the new session picks up the updated dictionary)
\c
-- Verify the new segmentation result
SELECT to_tsquery('testzhcfg', '保障房资金压力');
Après avoir ajouté, supprimé ou modifié des segments de mots, vous devez appeler zhprs_sync_dict_xdb() et vous reconnecter à la base de données pour que les modifications prennent effet. Les modifications ne s'appliquent pas aux sessions existantes.
Limites du dictionnaire personnalisé
| Limite | Valeur |
|---|---|
| Nombre maximal de segments de mots personnalisés | 1 000 000 |
| Longueur maximale par segment de mot | 128 octets |
Si le nombre de segments de mots dépasse 1 000 000, les segments au-delà de cette limite sont ignorés. Les segments de mots dépassant 128 octets sont tronqués au 128e octet.
Le dictionnaire personnalisé et le dictionnaire intégré sont actifs simultanément.