# Fuzzy syntaxe tilde

**URL:** https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374
**Category:** Discussions en français
**Created:** [February 24, 2017, 9:27am UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374 "2017-02-24T09:27:53Z")
**Posts on this page:** 12
**Page:** 1

<div class="post-metadata">

### Author: ![Karel\_SUEDILE](https://avatars.discourse-cdn.com/v4/letter/k/b5ac83/32.png) [@Karel\_SUEDILE](https://discuss.elastic.co/u/Karel_SUEDILE)
#### Post date: [February 24, 2017, 9:27am UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/1 "2017-02-24T09:27:53Z")

</div>

Bonjour,  
j'ai cru comprendre que les recherches fuzzy pouvaient automatiquement déterminer la distance de levenstein à appliquer en fonction de la longueur du mot recherché.

Je voulais savoir si la syntaxe avec le tilde "~" permettait de pouvoir spécifier cette valeur AUTO.  
Si oui, quelle valeur dois-je inscrire.

"query" : "Interdépartementalisation~\<fuzzy\_value\>"

---

<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: [February 24, 2017, 10:33am UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/2 "2017-02-24T10:33:57Z")

</div>

D'après ce que je comprends de la doc de Lucene: [https://lucene.apache.org/core/6\_4\_1/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#Fuzzy\_Searches](https://lucene.apache.org/core/6_4_1/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#Fuzzy_Searches)

Ne pas mettre de valeur à la fin rend le truc automatique.

Donc:

```auto
"query" : "Interdépartementalisation~"

```

---

<div class="post-metadata">

### Author: ![Karel\_SUEDILE](https://avatars.discourse-cdn.com/v4/letter/k/b5ac83/32.png) [@Karel\_SUEDILE](https://discuss.elastic.co/u/Karel_SUEDILE)
#### Post date: [February 24, 2017, 10:59am UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/3 "2017-02-24T10:59:01Z")

</div>

J'avais bien lu cela aussi.  
Mais d'après mes tests, ça ne fonctionne pas vraiment :

[https://www.wonderweekend.com/recherche?q=disneyland](https://www.wonderweekend.com/recherche?q=disneyland)  
=\> 1 résultat

[https://www.wonderweekend.com/recherche?q=disneylan~](https://www.wonderweekend.com/recherche?q=disneylan~)  
=\> 0 résultat

[https://www.wonderweekend.com/recherche?q=disneylan~1](https://www.wonderweekend.com/recherche?q=disneylan~1)  
=\> 1 résultat

Pour la requête ci-dessous, l'analyzer wwfrench est le french décrit dans la doc d'elasticsearch mais qui comprend en plus un fichier de synonymes dont la seule entrée est : disney , disneyland  
Voici la requête :

```auto
{
"size": 12,
"from": 0,
"_source": {
    "includes": ["offer.*"],
    "excludes": ["offer.thematics", "offer.destinations"]
},
"query": {
    "bool": {
        "must": [{
            "nested": {
                "path": "offer",
                "query": {
                    "bool": {
                        "must_not": [{
                            "range": {
                                "offer.deactivation_date": {
                                    "lte": "now"
                                }
                            }
                        }]
                    }
                }
            }
        }, {
            "term": {
                "nb_adults": 2
            }
        }, {
            "nested": {
                "path": "offer",
                "query": {
                    "bool": {
                        "must": [{
                            "simple_query_string": {
                                "query": "disneylan~",
                                "analyzer": "wwfrench",
                                "fields": ["offer.name^10", "offer.activity_subtitle^5", "offer.accom_subtitle", "offer.custom_1_content", "offer.custom_2_content"],
                                "default_operator": "or"
                            }
                        }],
                        "must_not": [{
                            "range": {
                                "offer.deactivation_date": {
                                    "lte": "now"
                                }
                            }
                        }]
                    }
                }
            }
        }],
        "must_not": [{
            "exists": {
                "field": "child1_age"
            }
        }, {
            "exists": {
                "field": "child2_age"
            }
        }, {
            "exists": {
                "field": "child3_age"
            }
        }, {
            "exists": {
                "field": "child4_age"
            }
        }]
    }
}
}

```

---

<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: [February 24, 2017, 1:15pm UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/4 "2017-02-24T13:15:42Z")

</div>

Merci de formatter avec:

````
```
CODE
```

````

Pour être honnête, je n'utilise quasiment jamais le query string query. Pas super fan de laisser ça dans les mains de l'utilisateur.

Tu pourrais faire un petit script tout simple pour reproduire ton cas?

---

<div class="post-metadata">

### Author: ![Karel\_SUEDILE](https://avatars.discourse-cdn.com/v4/letter/k/b5ac83/32.png) [@Karel\_SUEDILE](https://discuss.elastic.co/u/Karel_SUEDILE)
#### Post date: [February 24, 2017, 2:35pm UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/5 "2017-02-24T14:35:41Z")

</div>

Voici comment reproduire le problème :

Mapping

```auto
curl -XPUT "http://127.0.0.1:9200/fuzzyindex" -d '{
  "settings": {
    "index.mapping.total_fields.limit": 5000,
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.max_result_window": 50000
  },
  "mappings": {
    "fuzzytype": {
      "properties": {
        "offer": {
          "type": "nested",
          "properties": {
            "geo" : {
              "type": "geo_point"
            },
            "name": {
              "type": "text",
              "analyzer": "french"
            }
          }
        }
      }
    }
  }
}'

```

Indexing

```auto
curl -XPUT "http://127.0.0.1:9200/fuzzyindex/fuzzytype/1" -d '{
  "offer": {
    "geo": {
      "lat": 48,
      "lon": 2
    },
    "name": "disneyland"
  }
}'

```

Querying  
Exemple 1 : correct

```auto
curl -XPOST "http://127.0.0.1:9200/fuzzyindex/fuzzytype/_search" -d '{
  "query" : {
    "bool": {
      "must" : [
        {
          "nested": {
            "path": "offer",
            "query": {
              "simple_query_string": {
                "query": "disneylan~1",
                "analyzer": "french",
                "fields": [
                  "offer.name"
                ],
                "default_operator": "or"
              }
            }
          }
        }
      ]
    }
  }
}'

```

Exemple 2 : incorrect

```auto
curl -XPOST "http://127.0.0.1:9200/fuzzyindex/fuzzytype/_search" -d '{
  "query" : {
    "bool": {
      "must" : [
        {
          "nested": {
            "path": "offer",
            "query": {
              "simple_query_string": {
                "query": "disneylan~",
                "analyzer": "french",
                "fields": [
                  "offer.name"
                ],
                "default_operator": "or"
              }
            }
          }
        }
      ]
    }
  }
}'

```

---

<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: [February 25, 2017, 3:58am UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/6 "2017-02-25T03:58:59Z")

</div>

Excellent merci !

J'ai simplifié à fond ton cas et j'ai pu reproduire que le problème vient en fait de `simple_query_string`. `query_string` prend correctement ce paramètre.

J'ai ouvert:

> <https://github.com/elastic/elasticsearch/issues/23366>

---

<div class="post-metadata">

### Author: ![Karel\_SUEDILE](https://avatars.discourse-cdn.com/v4/letter/k/b5ac83/32.png) [@Karel\_SUEDILE](https://discuss.elastic.co/u/Karel_SUEDILE)
#### Post date: [February 25, 2017, 12:19pm UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/7 "2017-02-25T12:19:35Z")

</div>

Ok ! Et bien, merci aussi !

---

<div class="post-metadata">

### Author: ![Karel\_SUEDILE](https://avatars.discourse-cdn.com/v4/letter/k/b5ac83/32.png) [@Karel\_SUEDILE](https://discuss.elastic.co/u/Karel_SUEDILE)
#### Post date: [February 27, 2017, 10:50am UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/8 "2017-02-27T10:50:19Z")

</div>

Effectivement, ça fonctionne mieux.

Sinon, j'ai observé un comportement un peu bizarre sur le terme de recherche "gastronomique".

J'ai plusieurs documents indexés avec "gastronomie" et/ou "gastronomique"

Avec l'analyzer french + fuzzy, j'ai :

recherche sur "gxstronomique~1" : 0 résultat  
recherche sur "gxstronom~1" : plusieurs résultats

Ca donne l'impression que le stemmer ne s'active pas lorsque le fuzzy est déclenché.  
C'est normal ?

---

<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 1, 2017, 9:02pm UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/9 "2017-03-01T21:02:53Z")

</div>

> Ca donne l'impression que le stemmer ne s'active pas lorsque le fuzzy est déclenché.  
> C'est normal ?

Je ne sais pas. Peut-être encore une fois un exemple complet permettrait de rejouer ce cas.

En tout cas, demandons à @jpountz pour voir...

---

<div class="post-metadata">

### Author: ![jpountz](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jpountz/32/45836_2.png) [@jpountz](https://discuss.elastic.co/u/jpountz)
#### Post date: [March 1, 2017, 10:59pm UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/10 "2017-03-01T22:59:43Z")

</div>

En effet, le stemming n'est pas appliqué pour la recherche fuzzy. De façon générale, il faut appliquer une chaîne d'indexation simple lorsqu'on fait des recherches fuzzy, au plus du lowercasing et du asciifolding. Pour donner un exemple de problème qui peut se poser, il me semble que le stemmer français transforme "aboyer" en "aboi" et non "aboy" en raison du fait que le y se transforme en i lorsque le verbe est conjugué. En revanche, "aboy" resterait "aboy" puisque le stemmer ne reconnaît pas la terminaison d'un verbe. Cela peut donner des résultats très étranges avec les fuzzy queries puisque "aboi" serait à une distance moindre de "aboyer" que "aboy". En tant qu'utilisateur, je trouverais ça contre intuitif. En conclusion il n'y a pas vraiment de bonne manière de combiner stemming et fuzzy queries.

---

<div class="post-metadata">

### Author: ![Karel\_SUEDILE](https://avatars.discourse-cdn.com/v4/letter/k/b5ac83/32.png) [@Karel\_SUEDILE](https://discuss.elastic.co/u/Karel_SUEDILE)
#### Post date: [March 2, 2017, 12:57am UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/11 "2017-03-02T00:57:01Z")

</div>

Merci pour les explications.  
Et OK, e mettrai un exemple pour mon prochain problème 🙂

---

<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: [March 30, 2017, 12:57am UTC](https://discuss.elastic.co/t/fuzzy-syntaxe-tilde/76374/12 "2017-03-30T00:57:08Z")

</div>

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