Elasticsearch Begriff vs Match

Sep 01 2020

Ich muss eine Suchabfrage unter 2 Bedingungen schreiben.

  1. Zeitstempel
  2. Verzeichnis

Wenn ich Übereinstimmung in Suchanfragen wie unten verwende

{
   "query":{
      "bool":{
         "must":{
            "match":{
               "directory":"/user/ayush/test/error/"
            }
         },
         "filter":{
            "range":{
               "@timestamp":{
                  "gte":"2020-08-25 01:00:00",
                  "lte":"2020-08-25 01:30:00",
                  "format":"yyyy-MM-dd HH:mm:ss"
               }
            }
         }
      }
   }
}

Im Filterergebnis erhalte ich Datensätze mit Verzeichnis

  1. /user/ayush/test/error/
  2. /user/hive/
  3. /user/

aber wenn ich Begriff wie unten verwende

{
   "query":{
      "bool":{
         "must":{
            "term":{
               "directory":"/user/ayush/test/error/"
            }
         },
         "filter":{
            "range":{
               "@timestamp":{
                  "gte":"2020-08-25 01:00:00",
                  "lte":"2020-08-25 01:30:00",
                  "format":"yyyy-MM-dd HH:mm:ss"
               }
            }
         }
      }
   }
}

Ich erhalte keine Ergebnisse, auch nicht mit Verzeichniswert /user/ayush/test/error/

Antworten

1 ESCoder Sep 01 2020 at 15:43

Die Übereinstimmungsabfrage analysiert die Eingabezeichenfolge und erstellt daraus grundlegendere Abfragen.

Die Begriffsabfrage entspricht den genauen Begriffen.

In diesen Blogs finden Sie detaillierte Informationen:

SO Frage zu Term vs Match Abfrage

https://discuss.elastic.co/t/term-query-vs-match-query/14455

elasticsearch match vs term query

Der Feldwert /user/ayush/test/error/wird wie folgt analysiert:

POST/_analyze
{
  "analyzer" : "standard",
  "text" : "/user/ayush/test/error/"
}

Die generierten Token sind:

{
    "tokens": [
        {
            "token": "user",
            "start_offset": 1,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "ayush",
            "start_offset": 6,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "test",
            "start_offset": 12,
            "end_offset": 16,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "error",
            "start_offset": 17,
            "end_offset": 22,
            "type": "<ALPHANUM>",
            "position": 3
        }
    ]
}

Indexdaten:

{ "directory":"/user/ayush/test/error/" }
{ "directory":"/user/ayush/" }
{ "directory":"/user" }

Suchabfrage mit Termabfrage:

Die Begriffsabfrage wendet keine Analysatoren auf den Suchbegriff an und sucht daher nur nach diesem genauen Begriff im invertierten Index. Um nach dem genauen Begriff zu suchen, müssen Sie die Feldzuordnung verwenden directory.keywordODER ändern.

{
  "query": {
    "term": {
      "directory.keyword": {
        "value": "/user/ayush/test/error/",
        "boost": 1.0
      }
    }
  }
}

Suchergebnis für Begriffsabfrage:

"hits": [
            {
                "_index": "my_index",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.9808291,
                "_source": {
                    "directory": "/user/ayush/test/error/"
                }
            }
        ]