python - ElasticSearch 在索引整数和字符串的 JSON 数组时抛出映射器解析异常

标签 python json elasticsearch elasticsearch-exception

我正在尝试使用 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"] 将使其正常工作。如果当前设置上次崩溃,则当前设置崩溃;如果上次设置有效,则当前设置有效。到底是怎么回事?某种映射设置可以解决这个问题吗?我还没有弄清楚如何设置具有可变数组长度的 map 。我更愿意利用无模式输入,但我会采取任何可行的方法。

最佳答案

您的映射可能会遇到类型冲突。由于您已经表达了保持“无模式”的愿望,我假设您没有明确提供索引的映射。这很好用,只需认识到您索引的第一个文档将确定索引的架构。之后您索引的每个文档都具有相同的字段(按名称),这些字段必须符合与第一个文档相同的类型。

Elasticsearch 对于值数组没有任何问题。事实上,在底层,它将所有值视为数组(具有一个或多个条目)。稍微令人担忧的是您选择的示例数组,它混合了字符串和数字类型。由于数组中的每个值都会映射到名为“test”的字段,并且该字段可能只有一种类型,因此如果 ES 处理的第一个文档的第一个值是数字,它可能会将该字段分配为 long类型。然后, future 包含不能很好地解析为数字的字符串的文档将在 Elasticsearch 中导致异常。

看看 documentation on Dynamic Mapping .

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

关于python - ElasticSearch 在索引整数和字符串的 JSON 数组时抛出映射器解析异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35672046/

相关文章:

安卓系统.ErrnoException : isConnected failed: ECONNREFUSED (Connection refused)

jquery - Rails 4 Controller 不返回格式正确的 JSON

php - 根据 bool 字段值提升Elasticsearch结果

elasticsearch - Logstash/ Elasticsearch : guesses wrong for datatype for field

elasticsearch - 如何创建一个记录到特定 Elasticsearch 索引的 Laravel Logger?

python - 在 clustermap 上为等于零的值设置特定颜色

python - pyside-uic 在哪里?

java - 将 json 写入 String 而不是 java 中的文件

javascript - 如何使用Python创建一个HTML页面,用n种不同的颜色说Hello World n次,

Python - Pandas,将长列拆分为多列