web-dev-qa-db-fra.com

Elasticsearch: Différence entre "Terme", "Correspondance" et "Chaîne de requête"

Nouveau ici pour Elasticsearch et essayer de mieux comprendre la différence entre ces requêtes. Autant que je sache, term correspond à un seul terme (doit-il être minuscule pour que la correspondance fonctionne?), Et à la fois match phrase et query string correspond à une chaîne de texte.

95
blee908

term la requête correspond à un terme unique tel qu'il est: la valeur est non analysée . Donc, il ne doit pas nécessairement être mis en minuscule en fonction de ce que vous avez indexé.

Si vous avez fourni Bennett au moment de l'index et que la valeur n'est pas analysée, la requête suivante ne renverra rien:

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase query analysera les données saisies si des analyseurs sont définis pour le champ demandé et trouvera les documents correspondant aux critères suivants:

  • tous les termes doivent apparaître dans le champ
  • ils doivent avoir le même ordre que la valeur d'entrée

Par exemple, si vous indexez les documents suivants (en utilisant standard analyseur pour le champ foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

Cette match_phrase query ne renverra que les premier et deuxième documents:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

query_string interrogation par défaut sur un champ _ all qui contient le texte de plusieurs champs de texte à la fois. De plus, il est analysé et prend en charge certains opérateurs (AND/OR ...), les caractères génériques, etc. (voir syntaxe associée ).

Comme le match_phrase requêtes, l’entrée est analysée en fonction de l’analyseur défini dans le champ demandé.

Contrairement au match_phrase, il n’est pas nécessaire que les termes obtenus après analyse soient dans le même ordre, sauf si l’utilisateur a utilisé des guillemets autour de l’entrée.

Par exemple, en utilisant les mêmes documents qu'auparavant, cette requête renverra tous les documents:

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}

Mais cette requête retournera les 2 mêmes documents que le match_phrase requete :

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}

Il y a beaucoup à dire sur les différentes options pour ces requêtes, veuillez consulter la documentation correspondante:

J'espère que c'est assez clair et que ça va aider.

189
ThomasC

Je pense que quelqu'un cherche vraiment des différences entre eux en ce qui concerne RECHERCHE PARTIELLE Voici mon analyse avec default ‘analyseur standard’: -

Supposons, nous avons des données: -

{"nom": "Bonjour"}

Maintenant si nous voulons faire une recherche partielle avec ell ???

Requête de terme OR Requête de correspondance

{"term":{"name": "*ell*" }

Ne fonctionnera pas, retour en notant.

{"term":{"name": "*zz* *ell*" }

Ne fonctionnera pas, retour en notant.

Conclusion - Le terme ou la correspondance n'est pas capable de faire une recherche partielle

wildcard Requête: -

{"wildcard":{"name": "*ell*" }

Va-t-il donner le résultat {"name": "Hello"}

{"wildcard":{"name": "*zz* *ell*" }

Ne fonctionnera pas, retour en notant.

Conclusion - le joker est capable de faire une recherche partielle avec un seul jeton

Chaîne de requête :-

{"query_string": {"default_field": "name","query": "*ell*"}

Va-t-il donner le résultat {"name": “Hello”}

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

Cela fonctionnera donner le résultat {"name": “Hello”}.

Conclusion - query_string est capable de chercher avec deux jetons sont donnés

-> ici les jetons sont ell et zz

13
Vijay Gupta