# Analyzer pour une recherche partielle respectant l'ordre des mots

**URL:** <https://discuss.elastic.co/t/analyzer-pour-une-recherche-partielle-respectant-lordre-des-mots/94460>\
**Category:** Discussions en français\
**Created:** [July 25, 2017, 10:09am UTC](https://discuss.elastic.co/t/analyzer-pour-une-recherche-partielle-respectant-lordre-des-mots/94460 "2017-07-25T10:09:35Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Clemence](https://avatars.discourse-cdn.com/v4/letter/c/4af34b/32.png) [@Clemence](https://discuss.elastic.co/u/Clemence)\
**Post date:** [July 25, 2017, 10:09am UTC](https://discuss.elastic.co/t/analyzer-pour-une-recherche-partielle-respectant-lordre-des-mots/94460/1 "2017-07-25T10:09:35Z")

</div>

Bonjour,

Je débute avec ElasticSearch (5.4) et je m’intéresse particulièrement aux analyzers.  
Je cherche à faire une recherche qui peut être partielle mais dont l'ordre des mots à une importance.  
Pour exemple, par rapport au document indexé ci-dessous :

```auto
PUT my_index/doc/1
{
  "description": "Recherchez (et analysez) vos données en temps réel."
} 

```

Si on cherche les chaînes de caractères "Recherchez (et" ou "rchez (e", par exemple, le document va être trouvé mais pour la chaîne "Recherchez et analysez (et" ou "Recherch (et" le document ne va pas être trouvé. La ponctuation est, elle aussi, importante.

Pour le moment, cette configuration m'a donné les meilleurs résultats :

```auto
PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer",
          "filter": [
            "lowercase"
          ]
        },
        "my_analyzer_search": {
          "tokenizer": "keyword",
          "filter": "lowercase"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 8,
          "token_chars": [
            "letter",
            "digit",
            "punctuation",
            "symbol",
            "whitespace"
          ]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "description": {
          "type": "text",
          "analyzer": "my_analyzer",
          "search_analyzer": "my_analyzer_search"
        }
      }
    }
  }
}

```

J'utilise un analyzer pour l'indexation utilisant un tokenizer de type N-Gram pour la recherche partielle et, pour la recherche, un analyzer différent de type keyword pour l'ordre des mots.

Cependant mes documents pouvant être volumineux (jusqu'à une dizaine de Mo), cela demande beaucoup de ressources lors de l'indexation et la taille de l'index est énorme.  
Est-ce tout de même une bonne solution ? Y-a t-il d'autres alternatives pour ce cas d'utilisation ?

Merci d'avance pour votre 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:** [July 25, 2017, 10:29am UTC](https://discuss.elastic.co/t/analyzer-pour-une-recherche-partielle-respectant-lordre-des-mots/94460/2 "2017-07-25T10:29:50Z")

</div>

Tu pourrais éventuellement regarder du côté fuzzy search plutôt que de faire du ngram.

[https://www.elastic.co/guide/en/elasticsearch/reference/5.5/query-dsl-fuzzy-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.5/query-dsl-fuzzy-query.html)

Est-ce que ça t'aiderait ?

Pour l'ordre des mots, j'utiliserai une phrase search.

En combinant tout ça, tu peux influer sur l'ordre des résultats.

Ce script par exemple donne quelques exemples:

> <https://gist.github.com/dadoonet/5179ee72ecbf08f12f53d4bda1b76bab>

---

<div class="post-metadata">

**Author:** ![Clemence](https://avatars.discourse-cdn.com/v4/letter/c/4af34b/32.png) [@Clemence](https://discuss.elastic.co/u/Clemence)\
**Post date:** [July 26, 2017, 9:14am UTC](https://discuss.elastic.co/t/analyzer-pour-une-recherche-partielle-respectant-lordre-des-mots/94460/3 "2017-07-26T09:14:47Z")

</div>

Merci pour ta réponse et tes exemples. 🙂

J'ai essayé avec le fuzziness et le match\_phrase de la manière suivante :

```auto
GET my_index/_search
{
    "query": {
    "bool": {
      "should": [
                    {
          "match_phrase": {
            "comments": {
              "query" : "Who is that guy",
              "boost": 8.0
            }
          }
        },{
          "match": {
            "comments": {
              "query": "Who is that guy",
              "fuzziness": 2, 
              "boost": 2.0
            }
          }
        }  
        ]
    }
  }
}

```

Est-ce bien comme cela qu'il faut combiner les deux éléments ?

Cependant, par rapport à mon besoin, si le match\_phrase ne match pas dans un document, le fuzziness peut trouver quand même des résultats mais il ne fera plus attention à l'ordre des mots dans ce cas non ?

J'ai aussi peur que le fuzziness trouve des mots totalement différents alors que je cherche plus des bouts de mots au final. Peut-être est-ce possible avec une recherche de type wildcard ?

---

<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:** [July 26, 2017, 9:39am UTC](https://discuss.elastic.co/t/analyzer-pour-une-recherche-partielle-respectant-lordre-des-mots/94460/4 "2017-07-26T09:39:48Z")

</div>

> Est-ce bien comme cela qu'il faut combiner les deux éléments ?

Oui.

> mais il ne fera plus attention à l'ordre des mots dans ce cas non ?

Oui.

Je n'ai pas testé mais est-ce que tu peux faire aussi:

```
    {
      "match_phrase": {
        "comments": {
          "query" : "Who is that guy",
          "boost": 2.0,
          "fuzziness": "AUTO"
        }
      }
    }

```

> Peut-être est-ce possible avec une recherche de type wildcard ?

Noooooooooooooooonnnnnn! Ne pas utiliser wildcard (sauf si ta vie en dépend) 😉

---

<div class="post-metadata">

**Author:** ![Clemence](https://avatars.discourse-cdn.com/v4/letter/c/4af34b/32.png) [@Clemence](https://discuss.elastic.co/u/Clemence)\
**Post date:** [July 26, 2017, 12:01pm UTC](https://discuss.elastic.co/t/analyzer-pour-une-recherche-partielle-respectant-lordre-des-mots/94460/5 "2017-07-26T12:01:49Z")

</div>

> [@dadoonet](#):
>
> Noooooooooooooooonnnnnn! Ne pas utiliser wildcard (sauf si ta vie en dépend)

Ok je m'en souviendrai 😄

J'ai testé le match\_phrase avec le fuzziness mais visiblement la syntaxe n'est pas correcte j'ai le message suivant :

```auto
{
   "error": {
      "root_cause": [
         {
            "type": "parsing_exception",
            "reason": "[match_phrase] query does not support [fuzziness]",
            "line": 10,
            "col": 24
         }
      ],
      "type": "parsing_exception",
      "reason": "[match_phrase] query does not support [fuzziness]",
      "line": 10,
      "col": 24
   },
   "status": 400
}

```

---

<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:** [July 26, 2017, 4:19pm UTC](https://discuss.elastic.co/t/analyzer-pour-une-recherche-partielle-respectant-lordre-des-mots/94460/6 "2017-07-26T16:19:35Z")

</div>

Mouais. M'en doutais un peu.

Alors peut-être en utilisant des rqs très avancées comme les span queries... [https://www.elastic.co/guide/en/elasticsearch/reference/5.5/span-queries.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.5/span-queries.html)

Mais peut-être que @jpountz ou @jimczi ont une autre idée ?

---

<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:** [August 23, 2017, 4:19pm UTC](https://discuss.elastic.co/t/analyzer-pour-une-recherche-partielle-respectant-lordre-des-mots/94460/7 "2017-08-23T16:19:43Z")

</div>

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