Fuzzy syntaxe tilde

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>"

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

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

Donc:

"query" : "Interdépartementalisation~"

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

https://www.wonderweekend.com/recherche?q=disneyland
=> 1 résultat

https://www.wonderweekend.com/recherche?q=disneylan~
=> 0 résultat

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 :

{
"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"
            }
        }]
    }
}
}

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?

Voici comment reproduire le problème :

Mapping

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

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

Querying
Exemple 1 : correct

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

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"
              }
            }
          }
        }
      ]
    }
  }
}'

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:

Ok ! Et bien, merci aussi !

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 ?

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...

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.

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

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