Elasticsearch Begriff vs Match
Ich muss eine Suchabfrage unter 2 Bedingungen schreiben.
- Zeitstempel
- 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
/user/ayush/test/error//user/hive//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
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/"
}
}
]