# Comportement étrange sur une recherche full text

**URL:** <https://discuss.elastic.co/t/comportement-etrange-sur-une-recherche-full-text/172100>\
**Category:** Discussions en français\
**Created:** [March 13, 2019, 9:31am UTC](https://discuss.elastic.co/t/comportement-etrange-sur-une-recherche-full-text/172100 "2019-03-13T09:31:56Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![rorx](https://avatars.discourse-cdn.com/v4/letter/r/c67d28/32.png) [@rorx](https://discuss.elastic.co/u/rorx)\
**Post date:** [March 13, 2019, 9:31am UTC](https://discuss.elastic.co/t/comportement-etrange-sur-une-recherche-full-text/172100/1 "2019-03-13T09:31:56Z")

</div>

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](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)

```auto
{
  "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:

```auto
        "_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:

```auto
{
  "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`

```auto
{
  "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 ?

---

<div class="post-metadata">

**Author:** ![gabriel\_tessier](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/gabriel_tessier/32/27911_2.png) [@gabriel\_tessier](https://discuss.elastic.co/u/gabriel_tessier)\
**Post date:** [March 15, 2019, 5:19am UTC](https://discuss.elastic.co/t/comportement-etrange-sur-une-recherche-full-text/172100/2 "2019-03-15T05:19:23Z")

</div>

Bonjour,

Si ça peux aider tu peux essayer de debugger tes requêtes avec ce plugin:

> **[johtani/analyze-api-ui-plugin](https://github.com/johtani/analyze-api-ui-plugin)**
>
> Kibana app plugin for \_analyze API. Contribute to johtani/analyze-api-ui-plugin development by creating an account on GitHub.

Ca t'aidera a y voir plus claire.... j'avais utilisé un plugin similaire a l’époque ou j'avais rajouter des synonymes pour mon contenu.

---

<div class="post-metadata">

**Author:** ![rorx](https://avatars.discourse-cdn.com/v4/letter/r/c67d28/32.png) [@rorx](https://discuss.elastic.co/u/rorx)\
**Post date:** [March 27, 2019, 1:26pm UTC](https://discuss.elastic.co/t/comportement-etrange-sur-une-recherche-full-text/172100/3 "2019-03-27T13:26:44Z")

</div>

Merci pour ton aide, mais c'est juste en fait une interface graphique pour une requete de type \_analyze ?

En faisant un \_analyze justement, j'ai aussi remarqué un comportement bizarre avec l'analyzer french de base:

```
curl -X POST -H "Content-type: application/json" http://mon-serveur:9200/mon-index/_analyze?pretty -d '{"text": "vêtements rôles contrôle enrôler", "analyzer": "french"}'

```

La réponse:

```
{
  "tokens" : [
    {
      "token" : "vête",
      "start_offset" : 0,
      "end_offset" : 9,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "rôle",
      "start_offset" : 10,
      "end_offset" : 15,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "control",
      "start_offset" : 16,
      "end_offset" : 24,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "enrol",
      "start_offset" : 25,
      "end_offset" : 32,
      "type" : "<ALPHANUM>",
      "position" : 3
    }
  ]
}

```

Comment se fait il que l'accent circonflexe dans **vêtements** et **rôle** est conservé alors que pour **contrôle** et **enrôler** il est bien supprimé ?

---

<div class="post-metadata">

**Author:** ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)\
**Post date:** [March 27, 2019, 4:57pm UTC](https://discuss.elastic.co/t/comportement-etrange-sur-une-recherche-full-text/172100/4 "2019-03-27T16:57:40Z")

</div>

Tu peux éventuellement changer ce comportement en ajoutant un asciifolding filter à [l'analyzer par défaut](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#french-analyzer).

```auto
PUT /french_example
{
  "settings": {
    "analysis": {
      "filter": {
        "french_elision": {
          "type": "elision",
          "articles_case": true,
          "articles": [
              "l", "m", "t", "qu", "n", "s",
              "j", "d", "c", "jusqu", "quoiqu",
              "lorsqu", "puisqu"
            ]
        },
        "french_stop": {
          "type": "stop",
          "stopwords": "_french_" 
        },
        "french_keywords": {
          "type": "keyword_marker",
          "keywords": ["Exemple"] 
        },
        "french_stemmer": {
          "type": "stemmer",
          "language": "light_french"
        }
      },
      "analyzer": {
        "rebuilt_french": {
          "tokenizer": "standard",
          "filter": [
            "french_elision",
            "lowercase",
            "asciifolding",
            "french_stop",
            "french_keywords",
            "french_stemmer"
          ]
        }
      }
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![rorx](https://avatars.discourse-cdn.com/v4/letter/r/c67d28/32.png) [@rorx](https://discuss.elastic.co/u/rorx)\
**Post date:** [March 28, 2019, 8:52am UTC](https://discuss.elastic.co/t/comportement-etrange-sur-une-recherche-full-text/172100/5 "2019-03-28T08:52:54Z")

</div>

> [@dadoonet](#):
>
> asciifolding

Hello @dadoonet,

Ca marche effectivement avec le asciifolding, mais, juste pour comprendre, est-ce un comportement normal et voulu de l'analyzer french par défaut et dans ce cas, quelle est la raison/rêgle pour laquelle la tokenisation n'enlève pas les accents suivant les mots (vêtement, rôle alors que contrôle c'est ok) ?

Merci pour ton aide 🙂

---

<div class="post-metadata">

**Author:** ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)\
**Post date:** [March 28, 2019, 10:28am UTC](https://discuss.elastic.co/t/comportement-etrange-sur-une-recherche-full-text/172100/6 "2019-03-28T10:28:07Z")

</div>

Je ne sais pas pourquoi.  
L'essentiel est que ce soit consistent. Que la recherche et l'indexation donnent la même chose.

Néanmoins, si tu penses que c'est un problème, il faudrait ouvrir je pense une issue côté Lucene. Car Elasticsearch ne fait que utiliser `org.apache.lucene.analysis.fr.FrenchAnalyzer`.

---

<div class="post-metadata">

**Author:** ![rorx](https://avatars.discourse-cdn.com/v4/letter/r/c67d28/32.png) [@rorx](https://discuss.elastic.co/u/rorx)\
**Post date:** [March 28, 2019, 10:45am UTC](https://discuss.elastic.co/t/comportement-etrange-sur-une-recherche-full-text/172100/7 "2019-03-28T10:45:15Z")

</div>

OK, je voulais être sûr qu'il n'y avait pas une particularité côté Elasticsearch que je n'avais pas saisie.

Je testerai lucene en local dans un projet pour voir

Merci pour ton aide

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [April 25, 2019, 10:45am UTC](https://discuss.elastic.co/t/comportement-etrange-sur-une-recherche-full-text/172100/8 "2019-04-25T10:45:16Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
