Tous les produits
Search
Centre de documentation

:Utiliser des synonymes

Dernière mise à jour :Aug 09, 2026

Alibaba Cloud Elasticsearch prend en charge deux méthodes pour configurer des synonymes de recherche : le chargement d'un fichier de dictionnaire de synonymes dans le cluster ou la définition de synonymes directement dans les paramètres de l'index. Ces deux approches utilisent le filtre de jetons synonym au sein d'un analyseur personnalisé.

Exécutez toutes les commandes présentées dans cette rubrique depuis la console Kibana. Pour savoir comment y accéder, consultez la rubrique Connexion à la console Kibana.

Méthode 1 : Utiliser un fichier de dictionnaire de synonymes

Prérequis

Avant de commencer, assurez-vous d'avoir :

Les exemples ci-dessous utilisent le fichier analysis/aliyun_synonyms.txt, qui contient l'entrée begin, start.

Étape 1 : Créer un index

Créez un index avec un analyseur personnalisé qui fait référence au fichier de synonymes chargé :

PUT /aliyun-index-test
{
  "settings": {
    "index":{
      "analysis": {
          "analyzer": {
            "by_smart": {
              "type": "custom",
              "tokenizer": "ik_smart",
              "filter": ["by_tfr","by_sfr"],
              "char_filter": ["by_cfr"]
            },
            "by_max_word": {
              "type": "custom",
              "tokenizer": "ik_max_word",
              "filter": ["by_tfr","by_sfr"],
              "char_filter": ["by_cfr"]
            }
         },
         "filter": {
            "by_tfr": {
              "type": "stop",
              "stopwords": [" "]
              },
            "by_sfr": {
              "type": "synonym",
              "synonyms_path": "analysis/aliyun_synonyms.txt"
              }
           },
           "char_filter": {
             "by_cfr": {
               "type": "mapping",
               "mappings": ["| => |"]
             }
           }
       }
     }
   }
}

Le filtre by_sfr charge les synonymes depuis le fichier de dictionnaire téléchargé. L'analyseur by_max_word est utilisé pour l'indexation, tandis que by_smart sert aux requêtes de recherche.

Étape 2 : Configurer le mapping

Mappez le champ title pour utiliser les analyseurs personnalisés. La commande varie selon la version du cluster.

  • Elasticsearch 7.0 ou version ultérieure :

    PUT /aliyun-index-test/_mapping/
    {
    "properties": {
     "title": {
       "type": "text",
       "analyzer": "by_max_word",
       "search_analyzer": "by_smart"
     }
    }
    }
  • Versions antérieures à Elasticsearch 7.0 :

    PUT /aliyun-index-test/_mapping/doc
    {
    "properties": {
     "title": {
       "type": "text",
       "analyzer": "by_max_word",
       "search_analyzer": "by_smart"
     }
    }
    }
Important

Dans les versions open source d'Elasticsearch 7.0 et ultérieures, les types de mapping sont obsolètes et _doc est utilisé automatiquement. Ne spécifiez pas de type de mapping dans le chemin d'accès, sous peine de recevoir une erreur.

Étape 3 : Vérifier l'analyseur

Confirmez que le filtre de synonymes fonctionne correctement en analysant un terme de test :

GET /aliyun-index-test/_analyze
{
"analyzer": "by_smart",
"text":"begin"
}

La réponse doit inclure à la fois begin (type ENGLISH) et start (type SYNONYM) à la même position :

{
"tokens": [
 {
   "token": "begin",
   "start_offset": 0,
   "end_offset": 5,
   "type": "ENGLISH",
   "position": 0
 },
 {
   "token": "start",
   "start_offset": 0,
   "end_offset": 5,
   "type": "SYNONYM",
   "position": 0
 }
]
}

Étape 4 : Ajouter des documents de test

Indexez deux documents contenant des termes différents mais synonymes.

  • Elasticsearch 7.0 ou version ultérieure :

    PUT /aliyun-index-test/_doc/1
    {
    "title": "Shall I begin?"
    }
    PUT /aliyun-index-test/_doc/2
    {
    "title": "I start work at nine."
    }
  • Versions antérieures à Elasticsearch 7.0 :

    PUT /aliyun-index-test/doc/1
    {
    "title": "Shall I begin?"
    }
    PUT /aliyun-index-test/doc/2
    {
    "title": "I start work at nine."
    }

Étape 5 : Tester la recherche par synonymes

Recherchez le terme begin et vérifiez que les deux documents sont renvoyés, y compris celui qui contient start :

GET /aliyun-index-test/_search
{
 "query" : { "match" : { "title" : "begin" }},
 "highlight" : {
     "pre_tags" : ["<red>", "<bule>"],
     "post_tags" : ["</red>", "</bule>"],
     "fields" : {
         "title" : {}
     }
 }
}

Une réponse réussie renvoie les deux documents, avec les termes correspondants mis en surbrillance :

{
"took": 11,
"timed_out": false,
"_shards": {
 "total": 5,
 "successful": 5,
 "failed": 0
},
"hits": {
 "total": 2,
 "max_score": 0.41048482,
 "hits": [
   {
     "_index": "aliyun-index-test",
     "_type": "doc",
     "_id": "2",
     "_score": 0.41048482,
     "_source": {
       "title": "I start work at nine."
     },
     "highlight": {
       "title": [
         "I <red>start</red> work at nine."
       ]
     }
   },
   {
     "_index": "aliyun-index-test",
     "_type": "doc",
     "_id": "1",
     "_score": 0.39556286,
     "_source": {
       "title": "Shall I begin?"
     },
     "highlight": {
       "title": [
         "Shall I <red>begin</red>?"
       ]
     }
   }
 ]
}
}

Les deux documents correspondent car begin et start sont définis comme des synonymes.

Méthode 2 : Définir des synonymes inline

Cette méthode intègre directement les règles de synonymes dans les settings de l'index à l'aide du paramètre synonyms. Privilégiez cette approche pour des ensembles de synonymes simples et stables ne nécessitant pas de mises à jour fréquentes.

Étape 1 : Créer un index avec des synonymes inline

PUT /my_index
{
 "settings": {
     "analysis": {
         "analyzer": {
             "my_synonyms": {
                 "filter": [
                     "lowercase",
                     "my_synonym_filter"
                 ],
                 "tokenizer": "ik_smart"
             }
         },
         "filter": {
             "my_synonym_filter": {
                 "synonyms": [
                     "begin,start"
                 ],
                 "type": "synonym"
             }
         }
     }
 }
}

Cette configuration effectue les actions suivantes :

  1. Définit un filtre de synonymes (my_synonym_filter) avec la règle de synonyme inline begin,start.

  2. Crée l'analyseur my_synonyms en utilisant le tokenizer ik_smart.

  3. Après la tokenisation, applique lowercase et my_synonym_filter à tous les jetons.

Étape 2 : Configurer le mapping

  • Elasticsearch 7.0 ou version ultérieure :

    PUT /my_index/_mapping/
    {
    "properties": {
     "title": {
       "type": "text",
       "analyzer": "my_synonyms"
     }
    }
    }
  • Versions antérieures à Elasticsearch 7.0 :

    PUT /my_index/_mapping/doc
    {
    "properties": {
     "title": {
       "type": "text",
       "analyzer": "my_synonyms"
     }
    }
    }
Important

Dans les versions open source d'Elasticsearch 7.0 et ultérieures, les types de mapping sont obsolètes et _doc est utilisé automatiquement. Ne spécifiez pas de type de mapping dans le chemin d'accès, sous peine de recevoir une erreur.

Étape 3 : Vérifier l'analyseur

GET /my_index/_analyze
{
 "analyzer":"my_synonyms",
 "text":"Shall I begin?"
}

La réponse inclut begin (type ENGLISH) et start (type SYNONYM) à la même position, ce qui confirme que le filtre de synonymes est actif :

{
"tokens": [
 {
   "token": "shall",
   "start_offset": 0,
   "end_offset": 5,
   "type": "ENGLISH",
   "position": 0
 },
 {
   "token": "i",
   "start_offset": 6,
   "end_offset": 7,
   "type": "ENGLISH",
   "position": 1
 },
 {
   "token": "begin",
   "start_offset": 8,
   "end_offset": 13,
   "type": "ENGLISH",
   "position": 2
 },
 {
   "token": "start",
   "start_offset": 8,
   "end_offset": 13,
   "type": "SYNONYM",
   "position": 2
 }
]
}

Étape 4 : Ajouter des documents de test

  • Elasticsearch 7.0 ou version ultérieure :

    PUT /my_index/_doc/1
    {
    "title": "Shall I begin?"
    }
    PUT /my_index/_doc/2
    {
    "title": "I start work at nine."
    }
  • Versions antérieures à Elasticsearch 7.0 :

    PUT /my_index/doc/1
    {
    "title": "Shall I begin?"
    }
    PUT /my_index/doc/2
    {
    "title": "I start work at nine."
    }

Étape 5 : Tester la recherche par synonymes

GET /my_index/_search
{
"query" : { "match" : { "title" : "begin" }},
"highlight" : {
  "pre_tags" : ["<red>", "<bule>"],
  "post_tags" : ["</red>", "</bule>"],
  "fields" : {
      "title" : {}
  }
}
}

La réponse renvoie les deux documents :

{
"took": 11,
"timed_out": false,
"_shards": {
 "total": 5,
 "successful": 5,
 "failed": 0
},
"hits": {
 "total": 2,
 "max_score": 0.41913947,
 "hits": [
   {
     "_index": "my_index",
     "_type": "doc",
     "_id": "2",
     "_score": 0.41913947,
     "_source": {
       "title": "I start work at nine."
     },
     "highlight": {
       "title": [
         "I <red>start</red> work at nine."
       ]
     }
   },
   {
     "_index": "my_index",
     "_type": "doc",
     "_id": "1",
     "_score": 0.39556286,
     "_source": {
       "title": "Shall I begin?"
     },
     "highlight": {
       "title": [
         "Shall I <red>begin</red>?"
       ]
     }
   }
 ]
}
}