【发布时间】:2023-04-03 08:26:01
【问题描述】:
我正在尝试使用 python 从文件中提取 JSON 数组并将其输入到 ElasticSearch 中。数组如下所示:
{"name": [["string1", 1, "string2"],["string3", 2, "string4"], ... (variable length) ... ["string n-1", 3, "string n"]]}
ElasticSearch 在尝试索引数组时抛出 TransportError(400, mapper_parsing_exception, failed to parse)。我发现,每当我尝试向它提供包含字符串和整数的字符串时,ElasticSearch 有时会抛出相同的错误。因此,例如,以下内容有时会崩溃,有时会成功:
import json
from elasticsearch import Elasticsearch
es = Elasticsearch()
test = json.loads('{"test": ["a", 1, "b"]}')
print test
es.index(index, body=test)
这段代码是我可以在不破坏程序的情况下安全地注释掉的所有内容。我将 JSON 放入程序中,而不是从文件中读取它。我输入的实际字符串很长(否则我只会发布它们)并且总是会使程序崩溃。将 JSON 更改为 "test": ["a"] 将使其工作。如果上次崩溃,当前设置会崩溃,或者如果上次成功,则可以正常工作。到底是怎么回事?某种映射设置会解决这个问题吗?我还没有弄清楚如何设置具有可变数组长度的地图。我更愿意利用无模式输入,但我会采用任何可行的方法。
【问题讨论】:
-
这是您使用的实际代码吗?因为按原样,如果没有提供给
ElasticSearch的有效连接配置,这将无法工作:例如:Elasticsearch(['http://user:secret@localhost:9200/'])。此外,当您调用index. es.index(index, body=test, id='my_id', doc_type='things')时,您需要提供doc_type和id -
这个实际代码将返回我停留的异常。
Elasticsearch()方法默认为 localhost:9200,我有一个 Elasticsearch 的本地实例正在运行。默认情况下,doc_type和id也可以完美处理。此代码在不处理包含混合变量的数组时成功执行。 -
也许这会对你有所帮助。但这对我来说使用您的数据结构运行得非常好:pastebin.com/EQRgrk8M
-
嗯,感谢您的帮助,但这并不能从一开始就修复数组大小写,也不能解决数组大小写失败后拒绝单个列表大小写的行为。也许问题出在我的 Elasticsearch 上?我会重新安装它。
-
抱歉,我无法复制。我一直在尝试使用不同的数据结构,只要我传递有效的 json,它就可以工作。
标签: python json elasticsearch elasticsearch-exception