gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:59:37 25 4
gpt4 key购买 nike

我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com