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 :
Chargé un fichier de dictionnaire de synonymes dans le cluster. Consultez la rubrique Charger un fichier de dictionnaire de synonymes.
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" } } }
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 :
Définit un filtre de synonymes (
my_synonym_filter) avec la règle de synonyme inlinebegin,start.Crée l'analyseur
my_synonymsen utilisant le tokenizerik_smart.Après la tokenisation, applique
lowercaseetmy_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" } } }
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>?"
]
}
}
]
}
}