elasticsearch,elasticsearch-exception,Python,Json,elasticsearch,Elasticsearch Exception" /> elasticsearch,elasticsearch-exception,Python,Json,elasticsearch,Elasticsearch Exception" />

Python 索引整数和字符串的JSON数组时ElasticSearch引发映射器解析异常

Python 索引整数和字符串的JSON数组时ElasticSearch引发映射器解析异常,python,json,elasticsearch,elasticsearch-exception,Python,Json,elasticsearch,Elasticsearch Exception,我试图使用python从文件中提取JSON数组并将其输入ElasticSearch。该数组如下所示: {"name": [["string1", 1, "string2"],["string3", 2, "string4"], ... (variable length) ... ["string n-1", 3, "string n"]]} ElasticSearch在尝试为数组编制索引时抛出TransportError400,mapper_parsing_异常,未能解析。我发现,每当我尝试向

我试图使用python从文件中提取JSON数组并将其输入ElasticSearch。该数组如下所示:

{"name": [["string1", 1, "string2"],["string3", 2, "string4"], ... (variable length) ... ["string n-1", 3, "string n"]]}
ElasticSearch在尝试为数组编制索引时抛出TransportError400,mapper_parsing_异常,未能解析。我发现,每当我尝试向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对值数组没有问题。事实上,在后台,它将所有值视为包含一个或多个条目的数组。稍微值得关注的是您选择的示例数组,它混合了字符串和数字类型。由于数组中的每个值都映射到名为test的字段,并且该字段可能只有一种类型,因此如果第一个文档ES进程的第一个值是数字,则可能会将该字段指定为长类型。然后,如果将来的文档包含的字符串不能很好地解析为数字,则会导致Elasticsearch出现异常

看一看这张照片


少使用模式是很好的,但是在您的场景中,通过在索引上为文档中的至少一些字段显式声明映射,您可能会取得更大的成功。如果您计划为充满混合数据类型的数组编制索引,最好将该字段声明为字符串类型。

这是您实际使用的代码吗?因为按原样,如果没有提供给ElasticSearch的有效连接配置,这将无法工作:例如:ElasticSearch['http://user:secret@localhost:9200/']。此外,在调用索引时,还需要提供文档类型和id。es.indexindex,body=test,id='my'u id',doc'u type='things'此实际代码将返回我声明的异常。Elasticsearch方法默认为localhost:9200,我有一个运行Elasticsearch的本地实例。默认情况下,doc_类型和id也可以很好地处理。当不处理带有混合变量的数组时,此代码将成功执行。这可能会对您有所帮助。但是,使用您的数据结构,这对我来说运行得非常好:嗯,我感谢您的帮助,但这并不能从一开始就解决数组情况,也不能解决在数组情况失败后拒绝单个列表情况的行为。也许问题出在我的弹性搜索上?我会重新安装。对不起,我无法复制。我一直在尝试使用不同的数据结构,只要我传递有效的json,它就会工作。感谢您的编写!我研究了定义映射并阅读了官方文档,但我不知道如何以Elasticsearch可以接受的方式定义固定长度列表的可变长度列表。我希望你能在这方面提供帮助。我还认为数据库对模式的解释过于严格,拒绝了后来不匹配的数组,正如您所建议的,但即使我尝试只输入第一个数组,我也遇到了同样的崩溃,所以我认为这不是问题所在。当然,看看内部对象。或者,我可能不明白你所说的固定长度列表是什么意思?你能再详细一点吗?顶部的数组正是我输入的,是什么导致每次抛出这个异常的。想象一下一系列的产品评论,每个都有一个名称、一个评论和一个评分。不同的产品可能有不同数量的评审,但每个评审都有这三个属性。它往往是10-30条评论,而评论本身大约是1-3句话。我还有很多其他的产品数据,它们完全按照我的代码的意图输入,但是每次尝试执行review数组时都会抛出一个异常,即使我将它缩减为一个review.Gotcha。是的,我相信这是因为Elasticsearch需要为您尝试索引的每个值指定一个字段名。Y ou提供了一个数组数组,ES对内部数组的元素没有任何名称。您需要将名称字段调整为对象类型,并包含一个对象数组,以供审阅,而不是一个通用数组。