Créer une requête de type foo%

Bonjour,
Je suis très débutant dans l'utilisation d'elastic search. Je l'utilise au niveau d'un système E-Commerce (thirty bees).
Avec la configuration suivante :

{
  "bool": {
"must": [
  {
    "multi_match": {
      "query": ||QUERY||,
      "fields": ||FIELDS||,
      "type": "best_fields",
      "operator": "AND",
      "fuzziness": "auto"
    }
  }
]
  }
}

Sauf que lorsque je cherche "Domi" je n'ai qu'un résultat alors qu'il y a par exemple "DOMINION" qui affiche beaucoup de résultat
Est-ce qu'il est possible d'effectuer une recherche de type Domi% ?
J'ai essayé via la doc tellement de solution. Je ne trouve pas.
En effet c'est dommage de n'afficher qu'un résultat alors qu'il y en a pleins d'autres.

Merci beaucoup pour votre aide
A bientot

Bienvenue !

Voici ce que je ferais dans ton cas:

DELETE test 
PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ngram_analyzer": {
          "tokenizer": "lowercase",
          "filter": ["ngram"]
        }
      },
      "filter": {
        "ngram": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 10,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "foo": {
        "type": "text",
        "analyzer": "standard",
        "fields": {
          "ngram": {
            "type": "text",
            "analyzer": "ngram_analyzer",
            "search_analyzer": "simple"
          }
        }
      }
    }
  }
}
POST test/_analyze
{
  "analyzer": "ngram_analyzer",
  "text": ["DOMINION"]
}
POST test/_doc
{
  "foo": "DOMINION"
}
POST test/_doc
{
  "foo": "DOMI"
}
GET test/_search
{
  "query": {
    "multi_match": {
      "query": "domi",
      "fields": ["foo^3.0", "foo.ngram"]
    }
  }
}

Ca donne:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 2.0794415,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "8AGPrHUB7wlh68wAN_fY",
        "_score" : 2.0794415,
        "_source" : {
          "foo" : "DOMI"
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "7gGPrHUB7wlh68wAMff8",
        "_score" : 0.27101856,
        "_source" : {
          "foo" : "DOMINION"
        }
      }
    ]
  }
}

En mettant plus de poids sur le mots exacts que les versions partielles.

3 Likes

Bonjour,
Pour commencer je m'excuse de ma réponse tardive, et en même temps je vous remercie d'avoir pris le temps de répondre à ma question.
Je vais vous lire et essayer de comprendre, et de tester votre proposition
Cordialement