Czy istnieje lepszy sposób w elastycznym wyszukiwaniu (innym niż wydawanie wszystkich zapytań i ręcznym uśrednianiem długości wszystkich zwróconych dokumentów), aby uzyskać średnią długość dokumentu dla określonego indeksu?Elasticsearch, uzyskaj średnią długość dokumentu
Odpowiedz
_size mapping field, jeśli włączona, powinno dać rozmiar każdego dokumentu za darmo. Łącząc to z agregacją avg
, otrzymasz to, czego chcesz. Coś jak:
{
"query" : {"match_all" : {}},
"aggs" : {"avg_size" : {"avg" : {"terms" : {"field" : "_size"}}}}
}
Strzał w ciemno, ale fasety lub agregacje w połączeniu ze scenariuszem mogą to zrobić.
{
...,
"aggs" : {
"avg_length" : { "avg" : { "script" : "doc['_all'].length" } }
}
}
To się nie udaje z [email protected]f59))], od [0], rozmiar [10]: zapytanie nie powiodło się [Nie udało się wykonać głównego zapytania]]; zagnieżdżone: GroovyScriptExecutionException [MissingPropertyException [Exception evaluation property 'length' for org.elasticsearch.index.fielddata.ScriptDocValues $ Strings, Reason: groovy.lang.MissingPropertyException: Brak takiej właściwości: length for class: java.lang.String]]; " –
spróbuj doc ['_ all']. Values.size() zamiast – Arun
Po pierwsze, pole _all nie zawsze jest obecne, ponieważ zależy od szablonu indeksu Po drugie, w ten sposób uzyskujesz' The ' _all field to specjalne pole catch-all, które łączy wartości wszystkich pozostałych pól w jeden duży ciąg, używając spacji jako ogranicznika, [...] 'jak na https://www.elastic.co/guide/ pl/elasticsearch/reference/current/mapping-all-field.html i jest przestarzała w wersji 6.x – lucabelluccini
Użyłem tego kodu (mam włączony _source)
{
"query" : {"match_all" : {}},
"aggs":{
"avg_length" : { "avg" : { "script" : "_source.toString().length()"}}
}
}
Cóż, znaki .. .Przy struny są UTF-8, aby uzyskać bajty:
{
"query" : {"match_all" : {}},
"aggs":{
"avg_length" : { "avg" : { "script" : "_source.toString().getBytes(\"UTF-8\").length"}}
}
}
Podoba mi się to lepiej niż moja odpowiedź :) –
Jeśli chcesz uzyskać rozmiar dokumentów, musisz poinstruować ES, by zapisał rozmiar dla każdego dokumentu: https://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-size-field.html –
O ile nie używasz Elasticsearch 2.0 lub starszych, ta funkcja nie jest już obsługiwana. – lucabelluccini