elasticsearch - 名称为彼此子字符串的 Elasticsearch 键
问题描述
我已经用 Elasticsearch 玩了大约一天了,所以我非常陌生。我正在尝试POST
/import 一个简单的文档:
{
"compression" : "none",
"compression.level" : "0"
}
我收到以下错误:
{
"error": {
"root_cause": [
{
"type": "mapper_parsing_exception",
"reason": "object mapping for [compression] tried to parse field [compression] as object, but found a concrete value"
}
],
"type": "mapper_parsing_exception",
"reason": "object mapping for [compression] tried to parse field [compression] as object, but found a concrete value"
},
"status": 400
}
据我了解,Elasticsearch 将首先看到"compression" : "none"
并创建一个名为compression
字符串类型的键?然后,当它看到 时"compression.level" : "0"
,它会将其视为键“压缩”,对象值为.level" : "0"
? 或者……我真的不知道。
我怎样才能让它按预期工作?或者为什么它不像我预期的那样工作?
谢谢!
解决方案
compression
是类型object
,并且您正在尝试传递一个string
无法直接传递的值。下面的错误消息正确解释了它。
[compression] 的对象映射尝试将字段 [compression] 解析为对象,但找到了具体值
一个对象类型可以有多个sub-fields
,由 表示.
,您可以将单个值传递给这些子字段。因此,在您的情况下,您可以传递compression.level
.
请参考官方 ES 文档以获得更多解释和示例。https://www.elastic.co/guide/en/elasticsearch/reference/current/object.html
看起来您正在使用动态映射,在这种情况下,当 elasticsearch 看到带有 的字段名称时.
,如果存在具有相同名称但没有的对应字段.
,那么它会自动将其转换为object
类型,这发生在您的情况下。
如果您想要一个值的密钥,请告诉我您的要求是什么none
,那么您应该创建一个类似的文档:
{
"compression.stategy" : "none", // notice its a another sub-field.
"compression.level" : "0"
}
您可以通过点击https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-mapping.html查看所有子字段_mapping
根据您的理解(如果您使用的是动态映射),它有点不同,ES 将首先看到"compression" : "none"
然后尝试将其映射到文本字段,但随后它会看到另一个字段compression.level
并.
在字段名称中使用,并且compression
已经存在,因此开始将compression
其视为对象类型。
推荐阅读
- c# - C#HttpClient中如何计算发送请求的时间、等待响应的时间、接收响应的时间?
- python - 单击带有 selenium 和 python 的动态下拉元素
- flutter - 将默认图标主题设置为 cupertino flutter appbar
- github-actions - Github 操作在上一步提交后进行 lint
- python-3.x - 对于具有负整数的列表,默认情况下对集合进行反向排序
- c# - 带有复选框的 C# WPF 目录树视图:检查构建项目失败,PropertyChanged 为空
- asp.net - StackExchange.Redis ConnectionMultiplexer 池用于同步方法
- javascript - 从 JS 客户端上的 Flask 服务器接收 xlsx 文件
- java - 删除映射方法不适用于弹簧
- html - 使用 zurb 基础代码的手风琴切换图标