我可以使用以下代码将数据从pandas dataframe导入到elasticsearch。我只需要添加一个带有自动生成的序列号的id列。但是我可以使用messageid列作为id吗?
# message id looks like nucb-9a7ff0885b95efae
df["id"] = [x for x in range(len(df["messageid"])) ]
# the above statement works but the following does not
#df["id"] = df["messageid"]
tmp = df.to_json(orient = "records")
df_json= json.loads(tmp)
import elasticsearch
es = elasticsearch.Elasticsearch('https://some_site.com')
for id in df_json:
es.index(index='fromdf', doc_type='mydf', body=id)
elasticsearch中的id不必是数字。但是在使用python时,我收到错误
RequestError: TransportError(400, u'MapperParsingException[failed to parse [id]]; nested: NumberFormatException[For input string: "nucb-a006fd8dd60ac7a6"]; ')
如何确保我可以将批量方法与非数字ID一起使用?
换句话说,代码应该与
一起使用df["id"] = df["messageid"]
答案 0 :(得分:1)
索引方法签名:
~/workspace/scrapingEnv $ python test2.py
File "test2.py", line 7
if html is None:
^
SyntaxError: invalid syntax
所以你的数据应该转到正文,标识你的数据的标识符应该转到id。如果要存储由mesageid标识的消息,可以这样做:
def index(self, index, doc_type, body, id=None, params=None):
...
:arg index: The name of the index
:arg doc_type: The type of the document
:arg body: The document
:arg id: Document ID
...
您还可以使用已定义的函数(如pandas.DataFrame.to_dict)大大简化代码,这样您就不必转换为json并只需加载json即可获取字典。