Как передать данные в Elasticseach как целое число с помощью Python?

Я использую этот сценарий Python для подачи своих данных в asticsearch 6.0. Как я могу сохранить переменную Value с типом float в Elasticsearch? Я не могу использовать параметры метрики для визуализации в Kibana, потому что все данные автоматически сохраняются в виде строки

from elasticsearch import Elasticsearch

Device=""
Value=""
for key, value in row.items():  
    Device = key
    Value = value
    print("Dev",Device,  "Val:", Value)                     
    doc = {'Device':Device, 'Measure':Value ,  'Sourcefile':filename}
    print('   doc:    ', doc)
    es.index(index=name, doc_type='trends', body=doc)

Спасибо

РЕДАКТИРОВАТЬ:

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

import os,csv
import time
from elasticsearch import Elasticsearch
#import pandas as pd
import requests

Datum = time.strftime("%Y-%m-%d_")
path = '/home/pi/Desktop/Data'


os.chdir(path)
name = 'test'
es = Elasticsearch() 

    #'Time': time ,
#url = 'http://localhost:9200/index_name?pretty'
doc = {
  "mappings": {
    "doc": { 
      "properties": { 
        "device":    { "type": "text"  }, 
        "measure":     { "type": "text"  }, 
        "age":      { "type": "integer" },  
        "created":  {
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}
#headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
#r = requests.post(url, data=json.dumps(data), headers=headers)
r= es.index(index=name, doc_type='trends', body=doc)

print(r)

2 ответа

Решение

Вам необходимо отправить запрос HTTP Post, используя запрос Python, следующим образом:

url = "http://localhost:9200/index_name?pretty”
data = {
  "mappings": {
    "doc": { 
      "properties": { 
        "title":    { "type": "text"  }, 
        "name":     { "type": "text"  }, 
        "age":      { "type": "integer" },  
        "created":  {
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
r = requests.post(url, data=json.dumps(data), headers=headers)

Замените index_name в URL-адресе именем индекса, который вы определяете для механизма asticsearch.

Если вы хотите удалить индекс перед его повторным созданием, сделайте следующее:

url = "http://localhost:9200/index_name”
data = { }
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
r = requests.delete(url, data=json.dumps(data), headers=headers)

замените index_name в URL-адресе на ваше фактическое имя индекса. После удаления индекса создайте его снова с первым примером кода выше, включая сопоставления, которые вам понадобятся. Наслаждаться.

Elasticsearch определяет типы полей в отображении индекса. Похоже, что вы, вероятно, включили динамическое сопоставление, поэтому, когда вы отправляете данные в Elasticsearch впервые, это делает обоснованное предположение о форме ваших данных и типах полей.

После того, как эти типы установлены, они фиксируются для этого индекса, и Elasticsearch будет продолжать интерпретировать ваши данные в соответствии с этими типами независимо от того, что вы делаете в своем скрипте Python.

Чтобы это исправить, вам нужно:

  • Определите отображение индекса перед загрузкой любых данных. Это лучший вариант, поскольку он дает вам полный контроль над интерпретацией ваших данных. https://www.elastic.co/guide/en/elasticsearch/reference/6.0/mapping.html
  • Убедитесь, что при первой отправке данных в индекс вы используете правильные типы данных. Это будет зависеть от генерации динамического отображения, но, как правило, это будет правильно.

Определение отображения индекса является лучшим вариантом. Обычно это делается один раз, в Кибане или с помощью curl, или, если вы создаете много индексов, с помощью шаблона. Однако, если вы хотите использовать Python, вы должны посмотреть на create или же put_mapping функции на IndicesClient

Другие вопросы по тегам