Elasticsearch terme vs match
Je dois écrire une requête de recherche à 2 conditions.
- horodatage
- annuaire
Lorsque j'utilise une correspondance dans la requête de recherche comme ci-dessous
{
"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"
}
}
}
}
}
}
Dans le résultat du filtre, j'obtiens des enregistrements avec un répertoire
/user/ayush/test/error//user/hive//user/
mais quand j'utilise un terme comme ci-dessous
{
"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"
}
}
}
}
}
}
Je n'obtiens aucun résultat, même avec la valeur du répertoire /user/ayush/test/error/
Réponses
La requête de correspondance analyse la chaîne d'entrée et construit des requêtes plus basiques à partir de celle-ci.
Le terme requête correspond aux termes exacts.
Référez-vous à ces blogs pour obtenir des informations détaillées:
Question SO sur la requête Term vs Match
https://discuss.elastic.co/t/term-query-vs-match-query/14455
elasticsearch correspondance vs requête de terme
La valeur du champ /user/ayush/test/error/est analysée comme suit:
POST/_analyze
{
"analyzer" : "standard",
"text" : "/user/ayush/test/error/"
}
Les jetons générés sont:
{
"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
}
]
}
Données d'index:
{ "directory":"/user/ayush/test/error/" }
{ "directory":"/user/ayush/" }
{ "directory":"/user" }
Requête de recherche à l'aide de la requête de termes:
Le terme requête n'applique aucun analyseur au terme de recherche, il ne cherchera donc que ce terme exact dans l'index inversé. Donc, pour rechercher le terme exact, vous devez utiliser directory.keywordOU modifier le mappage du champ.
{
"query": {
"term": {
"directory.keyword": {
"value": "/user/ayush/test/error/",
"boost": 1.0
}
}
}
}
Résultat de la recherche pour la requête de termes:
"hits": [
{
"_index": "my_index",
"_type": "_doc",
"_id": "1",
"_score": 0.9808291,
"_source": {
"directory": "/user/ayush/test/error/"
}
}
]