- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 elasticsearch (5.5.1) 中有一个字段需要重命名,因为名称包含“.”它正在引起各种问题。我要重命名的字段嵌套在另一个字段中。
我正尝试在摄取管道中使用重命名处理器来执行重新索引,如下所述:https://stackoverflow.com/a/43142634/5114
这是我的管道模拟请求(您可以将此逐字复制到 Kibana 中的 Dev Tools 实用程序中进行测试):
POST _ingest/pipeline/_simulate
{
"pipeline" : {
"description": "rename nested fields to remove dot",
"processors": [
{
"rename" : {
"field" : "message.message.group1",
"target_field" : "message_group1"
}
},
{
"rename" : {
"field" : "message.message.group2",
"target_field" : "message.message_group2"
}
}
]
},
"docs":[
{
"_type": "status",
"_id": "1509533940000-m1-bfd7183bf036bd346a0bcf2540c05a70fbc4d69e",
"_version": 5,
"_score": null,
"_source": {
"message": {
"_job-id": "AV8wHJEaa4J0sFOfcZI5",
"message.group1": 0,
"message.group2": "foo"
},
"timestamp": 1509533940000
}
}
]
}
问题是我在尝试使用我的管道时遇到错误:
{
"docs": [
{
"error": {
"root_cause": [
{
"type": "exception",
"reason": "java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: field [message.message.group1] doesn't exist",
"header": {
"processor_type": "rename"
}
}
],
"type": "exception",
"reason": "java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: field [message.message.group1] doesn't exist",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "java.lang.IllegalArgumentException: field [message.message.group1] doesn't exist",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "field [message.message.group1] doesn't exist"
}
},
"header": {
"processor_type": "rename"
}
}
}
]
}
我认为问题是由字段“message.group1”在另一个字段(“message”)内引起的。我不确定如何在处理器的上下文中引用我想要的字段。似乎嵌套字段、包含点的字段和包含点的嵌套字段之间可能存在歧义。
我正在寻找引用这些字段的正确方法,或者如果 Elasticsearch 不能执行我想要的操作,请确认这是不可能的。如果 Elasticsearch 可以做到这一点,那么它可能会非常快,否则我必须编写一个外部脚本来拉取文档,转换它们,然后将它们重新保存到新索引。
最佳答案
好的,调查 Elasticsearch 代码,我想我知道为什么这行不通了。
首先我们看一下Elasticsearch Rename Processor: https://github.com/elastic/elasticsearch/blob/9eff18374d68355f6acb58940a796268c9b6f2de/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/RenameProcessor.java#L76-L84
Object value = document.getFieldValue(field, Object.class);
document.removeField(field);
try {
document.setFieldValue(targetField, value);
} catch (Exception e) {
// setting the value back to the original field shouldn't as we just fetched it from that field:
document.setFieldValue(field, value);
throw e;
}
这是在寻找要重命名的字段,获取其值,然后删除该字段并添加一个具有相同值但使用新名称的新字段。
现在我们看看 document.getFieldValue 中发生了什么: https://github.com/elastic/elasticsearch/blob/9eff18374d68355f6acb58940a796268c9b6f2de/core/src/main/java/org/elasticsearch/ingest/IngestDocument.java#L101-L108
public <T> T getFieldValue(String path, Class<T> clazz) {
FieldPath fieldPath = new FieldPath(path);
Object context = fieldPath.initialContext;
for (String pathElement : fieldPath.pathElements) {
context = resolve(pathElement, path, context);
}
return cast(path, context, clazz);
}
请注意,它使用 FieldPath 对象来表示文档中字段的路径。
现在看看 FieldPath 是如何表示路径的: https://github.com/elastic/elasticsearch/blob/9eff18374d68355f6acb58940a796268c9b6f2de/core/src/main/java/org/elasticsearch/ingest/IngestDocument.java#L688
this.pathElements = newPath.split("\\.");
这是在任何“.”上分割路径。字符,因为它是字段名称中路径元素之间的分隔符。
问题是源文档有一个名为“message.group1”的字段,所以我们需要能够引用它。只是在“。”上拆分路径。不考虑包含“.”的字段名称在名字里。为此,我们需要一种更像 javascript 的语法,我们可以在其中使用方括号和引号使点表示不同的意思。
如果源文件都被转换成一个“.”在字段名称中将在保存之前将该字段转换为对象,然后此路径方案将起作用。但是对于字段名称包含“.”的源文档。我们不能在某些情况下引用它们。
为了解决我的问题并重新索引我的索引,我编写了一个 python 脚本,它提取了一批文档,对其进行了转换,然后将它们批量插入到新索引中。这基本上就是 Elasticsearch reindex api 所做的,但我是用 python 代替的。
关于elasticsearch - 如何使用 elasticsearch 重命名处理器和摄取管道重命名包含点的嵌套字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47059506/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!