Как получить размер документов (в байтах) в Elasticsearch - PullRequest
0 голосов
/ 24 декабря 2018

Я новичок вasticsearch.Мне нужно получить размер документов результатов запроса.

Пример: - this is a document. (19bytes). this is also a document. (24bytes) content:{"a":"this is a document", "b":"this is also a document"}(53bytes) когда я запрашиваю документ в ES.Я получу вышеуказанные документы в результате.Итак, размер обоих документов составляет 32 байта.В результате мне нужно 32 байта вasticsearch.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Содержит ли ваш документ только одно поле?Я не уверен, что это 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 может быть либо типа текста, либо иметь вложенный документ, но вы не можете смешать это.

0 голосов
/ 24 декабря 2018

Невозможно получить размер документовasticsearch по API.Причина в том, что документ, индексированный для Elasticsearch, имеет разный размер в индексе, в зависимости от того, сохраняете ли вы _all, какие поля индексируются, и тип отображения этих полей, doc_value и другие.Кроме того ,asticsearch использует дедупликацию и другие методы сжатия, поэтому размер индекса не имеет линейной корреляции с исходными документами, которые он содержит.

Один из способов обойти это - заранее рассчитать размер документа перед его индексацией, идобавьте его как другое поле в документе, то есть поле doc_size.затем вы можете запросить это вычисляемое поле и выполнить на нем агрегирование.

Обратите внимание, что, как я уже говорил выше, это не представляет размер индекса и может быть совершенно неверным - например, если все документы содержат очень длинное текстовое поле с одинаковым значением, то Elasticsearch будет толькосохраняйте это длинное значение один раз и обращайтесь к нему, чтобы размер индекса был намного меньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...