elasticsearch bulk方法失败,带有字母数字id

时间:2015-12-07 05:57:05

标签: python pandas elasticsearch

我可以使用以下代码将数据从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"]

1 个答案:

答案 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即可获取字典。