web-dev-qa-db-fra.com

elasticsearch match vs requête de terme

J'utilise la recherche par requête de correspondance pour "request.method": "GET":

    {
      "query": {
        "filtered": {
          "query": {
            "match": {
              "request.method": "GET"
            }
          },
          "filter": {
            "bool": {
              "must": [
...

Comme prévu, la requête de correspondance peut obtenir les résultats, comme indiqué ci-dessous:

enter image description here

Mais la question est lors de l'utilisation de la requête Term, il n'y a pas de résultats.

Mettez à jour la requête pour remplacer "match" par "term", et conservez l'autre partie:

{
  "query": {
    "filtered": {
      "query": {
        "term": {
          "request.method": "GET"
        }
      },
      "filter": {
        "bool": {
          "must": [
...

Je pense que la requête Term est la version "non analysée" de la requête Match. Comme le montre l'image ci-dessus, il existe au moins un enregistrement dont "request.method" est égal à "GET". Pourquoi n'y a-t-il aucun résultat pour la requête Term susmentionnée? Merci.

enter image description here

64
Linlin

En supposant que vous utilisez le Standard AnalyzerGET devient get lorsqu'il est stocké dans l'index. Le document source aura toujours l'original "GET".

La requête match appliquera le même analyseur standard au terme de recherche et correspondra donc à ce qui est stocké dans l'index. La requête term n'applique aucun analyseur au terme recherché, elle recherchera donc uniquement ce terme dans l'index inversé.

Pour utiliser le terme requête dans votre exemple, modifiez la majuscule "GET" en minuscule "get" ou modifiez votre mappage de sorte que le champ request.method soit défini sur not_analyzed.

82
Akshay