Как передать данные в 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