Содержит ли ваш документ только одно поле?Я не уверен, что это 100% от того, что вы хотите, но обычно вы можете рассчитать длину полей и либо сохранить их вместе с документом, либо рассчитать их во время запроса (но это медленная операция, и я бы по возможности ее избегал)).
Итак, вот пример с тестовым документом и вычислением длины поля:
PUT test/_doc/1
{
"content": "this is a document."
}
POST test/_update_by_query
{
"query": {
"bool": {
"must_not": [
{
"exists": {
"field": "content_length"
}
}
]
}
},
"script": {
"source": """
if(ctx._source.containsKey("content")) {
ctx._source.content_length = ctx._source.content.length();
} else {
ctx._source.content_length = 0;
}
"""
}
}
GET test/_search
Тогда результат запроса:
{
"took" : 6,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"content" : "this is a document.",
"content_length" : 19
}
}
]
}
}
Кстати19 символов (включая пробелы и точки в этом).Если вы хотите исключить их, вам нужно добавить еще немного логики в сценарий.Я был бы осторожен с байтами BTW, так как UTF8 может использовать более одного байта на символ (например, höhe
), и этот скрипт действительно только подсчитывает символы.
Тогда вы можете легко использовать длину в запросах и агрегатах.
Если вы хотите рассчитать размер всех вложенных документов, используйте следующее:
PUT test/_doc/2
{
"content": {
"a": "this is a document",
"b": "this is also a document"
}
}
POST test/_update_by_query
{
"query": {
"bool": {
"must_not": [
{
"exists": {
"field": "content_length"
}
}
]
}
},
"script": {
"source": """
if(ctx._source.containsKey("content")) {
ctx._source.content_length = 0;
for (item in ctx._source.content.entrySet()) {
ctx._source.content_length += item.getValue().length();
}
}
"""
}
}
GET test/_search
Просто обратите внимание, что content
может быть либо типа текста, либо иметь вложенный документ, но вы не можете смешать это.