Termin Elasticsearch a dopasowanie

Sep 01 2020

Muszę napisać zapytanie pod warunkiem 2.

  1. znak czasu
  2. informator

Kiedy używam dopasowania w zapytaniu wyszukiwania, jak poniżej

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

W wyniku filtra otrzymuję rekordy z katalogiem

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

ale kiedy używam terminu jak poniżej

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

Nie otrzymuję żadnych wyników nawet z wartością katalogu /user/ayush/test/error/

Odpowiedzi

1 ESCoder Sep 01 2020 at 15:43

Zapytanie dopasowujące analizuje ciąg wejściowy i konstruuje na jego podstawie bardziej podstawowe zapytania.

Zapytanie terminowe odpowiada dokładnym terminom.

Odwiedź te blogi, aby uzyskać szczegółowe informacje:

Pytanie SO dotyczące zapytania Term vs Match

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

dopasowanie elastycznego wyszukiwania do zapytania terminowego

Wartość pola /user/ayush/test/error/jest analizowana w następujący sposób:

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

Wygenerowane tokeny to:

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

Dane indeksowe:

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

Zapytanie wyszukiwania przy użyciu zapytania terminowego:

Termin zapytanie nie stosuje żadnych analizatorów do wyszukiwanego terminu, więc będzie szukać tylko tego dokładnego terminu w odwróconym indeksie. Aby więc wyszukać dokładny termin, musisz użyć directory.keywordLUB zmienić mapowanie pola.

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

Wynik wyszukiwania dla zapytania hasła:

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