Динамическое отображение типов данных числовых полей больше чем 2 ^ 63 - 1 (длинный тип) - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть следующий пример входных данных "doc".

Индексирование с помощью pythonasticsearch:

doc =  {
    "node": [{
        "table": [{
          "node-table": {
            "packets-up": 18440044073709951615,
            "packets-down": 18447644073709991615
          }
        }]
      }]
}

from elasticsearch import Elasticsearch

es = Elasticsearch(hosts="localhost:9200")

res = es.indices.create(index="doc")

es.index(index="doc", doc_type='docs', body=doc)

При попытке индексировать данные с помощью динамического отображения я получаю следующую ошибку:

    Traceback (most recent call last):
  File "test.py", line 60, in <module>
    es.index(index="doc_test", doc_type='docs', body=doc)
  File "/Users/user/Projects/2018/es_test/.env/lib/python2.7/site-packages/elasticsearch/client/utils.py", line 76, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/Users/user/Projects/2018/es_test/.env/lib/python2.7/site-packages/elasticsearch/client/__init__.py", line 319, in index
    _make_path(index, doc_type, id), params=params, body=body)
  File "/Users/user/Projects/2018/es_test/.env/lib/python2.7/site-packages/elasticsearch/transport.py", line 318, in perform_request
    status, headers_response, data = connection.perform_request(method, url, params, body, headers=headers, ignore=ignore, timeout=timeout)
  File "/Users/user/Projects/2018/es_test/.env/lib/python2.7/site-packages/elasticsearch/connection/http_urllib3.py", line 186, in perform_request
    self._raise_error(response.status, raw_data)
  File "/Users/user/Projects/2018/es_test/.env/lib/python2.7/site-packages/elasticsearch/connection/base.py", line 125, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
elasticsearch.exceptions.RequestError: RequestError(400, u'mapper_parsing_exception', u'failed to parse')

Я предполагаю, что это связано с тем, что числовые значения не соответствуют типу данных "long".

Как мы можем обработать эти числовые значения.

Трассировка ElasticSearch:

curl -H 'Content-Type: application/json' -XPOST 'http://localhost:9200/doc/docs?pretty' -d '
  {
    "node": [
      {
        "table": [
          {
            "node-table": {
              "packets-down": 18447644073709991615,
              "packets-up": 18440044073709951615
            }
          }
        ]
      }
    ]
  }
'

Ответ:

    {
  "error" : {
    "root_cause" : [
      {
        "type" : "mapper_parsing_exception",
        "reason" : "failed to parse"
      }
    ],
    "type" : "mapper_parsing_exception",
    "reason" : "failed to parse",
    "caused_by" : {
      "type" : "illegal_state_exception",
      "reason" : "No matching token for number_type [BIG_INTEGER]"
    }
  },
  "status" : 400
}

1 Ответ

0 голосов
/ 29 ноября 2018

У вас есть два варианта, чтобы обойти эту проблему.

Опция A. Сохраняйте эти значения как float (или double) вместо long.

Сначала необходимо убедиться, что ваш packets-down и packets-up поля отображаются как float (или double), например:

PUT doc_test
{
  "mappings": {
    "docs": {
      "dynamic_templates": [
        {
          "bignums": {
            "match": "packets*",
            "mapping": {
              "type": "float"
            }
          }
        }
      ]
    }
  }
}

А затем вам нужно заключить число в двойные кавычки и отправить их в виде строки:

doc =  {
    "node": [{
        "table": [{
          "node-table": {
            "packets-up": "18440044073709951615",
            "packets-down": "18447644073709991615"
          }
        }]
      }]
}

Это сработает, и вы сможете суммировать свое поле пакета как любое другое поле, содержащее числовые значения.

Опция B. Включить обнаружение чисел (отключенопо умолчанию)

PUT doc_test
{
  "mappings": {
    "docs": {
      "numeric_detection": true
    }
  }
}

И затем вам также нужно заключить число в двойные кавычки и отправить их в виде строки:

doc =  {
    "node": [{
        "table": [{
          "node-table": {
            "packets-up": "18440044073709951615",
            "packets-down": "18447644073709991615"
          }
        }]
      }]
}

В результате большие числа будут сопоставленыкак float

...