Bonjour,
Je fais face à un comportement qui m'échappe lors d'une requête de recherche full text. Je suis sur la version 6.6
Le contexte tout d'abord: Je cherche à faire un mappage de catégories entre les catégories produit d'un client et celles de google shopping (disponibles ici https://www.google.com/basepages/producttype/taxonomy-with-ids.fr-FR.txt).
Pour cela, j'ai importé toutes les catégories google dans un index elasticsearch, et fait un analyser custom pour gérer des synonymes.
Voici un exemple du mapping de l'index (seul le fr a un analyser custom "google_fr" pour l'instant)
{
"google_categories" : {
"aliases" : { },
"mappings" : {
"categories" : {
"dynamic_date_formats" : [ ],
"properties" : {
"de" : {
"type" : "text",
"analyzer" : "german"
},
"en" : {
"type" : "text",
"analyzer" : "english"
},
"es" : {
"type" : "text",
"analyzer" : "spanish"
},
"fr" : {
"type" : "text",
"analyzer" : "google_fr"
},
"it" : {
"type" : "text",
"analyzer" : "italian"
}
}
}
},
"settings" : {
"index" : {
"number_of_shards" : "4",
"provided_name" : "google_categories",
"creation_date" : "1552466977378",
"analysis" : {
"filter" : {
"fr_syn" : {
"ignore_case" : "true",
"expand" : "true",
"type" : "synonym",
"synonyms" : [
"boites sachet chien => nourriture pour chien",
"boites sachet chat => nourriture pour chat"
]
},
"fr_elision" : {
"type" : "elision",
"articles" : [
"l",
"m",
"t",
"qu",
"n",
"s",
"j",
"d",
"c",
"jusqu",
"quoiqu",
"lorsqu",
"puisqu"
],
"articles_case" : "true"
},
"fr_stemmer" : {
"type" : "stemmer",
"language" : "light_french"
}
},
"analyzer" : {
"google_fr" : {
"filter" : [
"lowercase",
"fr_elision",
"fr_syn",
"fr_stemmer"
],
"tokenizer" : "standard"
}
}
},
"number_of_replicas" : "0",
"uuid" : "pG5J_n9DQ0Oe16S4jlijdA",
"version" : {
"created" : "6060199"
}
}
}
}
}
Chaque propriété correspond à un tableau contenant la hiérarchie de la catégorie pour chaque langue. Par exemple, la catégorie
"Animaux et articles pour animaux de compagnie > Articles pour animaux de compagnie > Accessoires pour chiens > Nourriture pour chiens"
est stockée sous cette forme:
"_id" : "3530",
"_source" : {
"fr" : [
"Animaux et articles pour animaux de compagnie",
"Articles pour animaux de compagnie",
"Accessoires pour chiens",
"Nourriture pour chiens"
],
}
C'est lorsque je fais une recherche sur une chaîne qui matche un synonyme que j'obtiens un résultat curieux. Par exemple, j'ai la catégorie client "boites sachet chien opti life (versele laga) besoins spécifiques" que je cherche à matcher. J'ai un synonyme qui remplace "boite sachet chien" par "nourriture pour chien" (catégorie google).
Si je fais une recherche explicite sur le champ fr (car je connais la langue lorsque je fais la recherche)
/google_categories/_search?pretty&q=fr:boites+sachet+chien+opti+life+(versele+laga)+besoins+spécifiques
J'obtiens comme résultat le plus pertinent:
{
"took" : 18,
"timed_out" : false,
"_shards" : {
"total" : 4,
"successful" : 4,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 53,
"max_score" : 7.734096,
"hits" : [
{
"_index" : "google_categories",
"_type" : "categories",
"_id" : "5010",
"_score" : 7.734096,
"_source" : {
"fr" : [
"Animaux et articles pour animaux de compagnie",
"Articles pour animaux de compagnie",
"Accessoires pour chiens",
"Jouets pour chiens"
],
...
{
"_index" : "google_categories",
"_type" : "categories",
"_id" : "5011",
"_score" : 7.3680334,
"_source" : {
"fr" : [
"Animaux et articles pour animaux de compagnie",
"Articles pour animaux de compagnie",
"Accessoires pour chiens",
"Friandises pour chiens",
...
{
"_index" : "google_categories",
"_type" : "categories",
"_id" : "4434",
"_score" : 7.3680334,
"_source" : {
"fr" : [
"Animaux et articles pour animaux de compagnie",
"Articles pour animaux de compagnie",
"Accessoires pour chiens",
"Paniers pour chiens"
],
"Nourriture pour chien n'arrivant" qu'en 5ème position
Si je fais une recherche globale, "nourriture pour chien" arrive cette fois en première position
/google_categories/_search?pretty&q=boites+sachet+chien+opti+life+(versele+laga)+besoins+spécifiques
{
"took" : 17,
"timed_out" : false,
"_shards" : {
"total" : 4,
"successful" : 4,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2000,
"max_score" : 13.622583,
"hits" : [
{
"_index" : "google_categories",
"_type" : "categories",
"_id" : "3530",
"_score" : 13.622583,
"_source" : {
"fr" : [
"Animaux et articles pour animaux de compagnie",
"Articles pour animaux de compagnie",
"Accessoires pour chiens",
"Nourriture pour chiens"
],
Quelle est la raison pour laquelle la recherche globale est plus précise que la recherche sur le champ de la langue correspondante ?