Elasticsearch term vs match
Eu tenho que escrever uma consulta de pesquisa em 2 condições.
- timestamp
- 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
/user/ayush/test/error//user/hive//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
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/"
}
}
]