Elasticsearch term vs match

Sep 01 2020

Eu tenho que escrever uma consulta de pesquisa em 2 condições.

  1. timestamp
  2. diretório

Quando estou usando correspondência na consulta de pesquisa como abaixo

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

No resultado do filtro, estou obtendo registros com diretório

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

mas quando estou usando um termo como abaixo

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

Não estou obtendo nenhum resultado, nem mesmo com o valor do diretório /user/ayush/test/error/

Respostas

1 ESCoder Sep 01 2020 at 15:43

A consulta de correspondência analisa a string de entrada e constrói consultas mais básicas a partir dela.

O termo consulta corresponde aos termos exatos.

Consulte estes blogs para obter informações detalhadas:

Pergunta SO na consulta de termo vs correspondência

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

correspondência de elasticsearch vs consulta de termo

O valor do campo /user/ayush/test/error/é analisado da seguinte forma:

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

Os tokens gerados são:

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

Dados do índice:

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

Consulta de pesquisa usando consulta de termo:

O termo consulta não se aplica a nenhum analisador ao termo de pesquisa, portanto, procurará apenas esse termo exato no índice invertido. Portanto, para pesquisar o termo exato, você precisa usar directory.keywordOU alterar o mapeamento do campo.

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

Resultado da pesquisa para consulta de termo:

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