Elasticsearch:Dot expander processor - 将带点的字段 foor.bar 扩展为 Object
Posted Elastic 中国社区官方博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:Dot expander processor - 将带点的字段 foor.bar 扩展为 Object相关的知识,希望对你有一定的参考价值。
在我之前的文章 “Elasticsearch:Ingest Pipeline 实践”,有一个开发者在评论区问道像 foo.bar 这样的字段如何变成 object 数据类型。在实际的使用中,我们可以使用 dot expander 处理器。它将带点的字段扩展为对象字段。 此处理器允许管道中的其他处理器访问名称中带有点的字段。 否则,任何处理器都无法访问这些字段。
我将使用一个简单的例子来进行展示。
实例
我们首先来创建一个如下的 Ingest Pipeline:
POST _ingest/pipeline/_simulate
{
"pipeline": {
"description": "Use dot expander to convert a field with dots into object",
"processors": [
{
"dot_expander": {
"field": "geo.city"
}
}
]
},
"docs": [
{
"_source": {
"geo.city": "Beijing"
}
}
]
}
上面,我们使用了 dot expander 处理器。当我们的一个字段为 geo.city 时,我们想把它转换为 object。使用上面的 ingest pipeline 处理,我们可以可以看到如下的结果:
{
"docs" : [
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"geo" : {
"city" : "Beijing"
}
},
"_ingest" : {
"timestamp" : "2021-06-26T04:07:24.980082Z"
}
}
}
]
}
显然,我们可以看到 city 现在是 geo object 下的一个字段了。
如果已经有一个 city 字段嵌套在 geo 下,则该处理器会将 geo.city 字段合并到其中。 如果该字段是标量值,那么它将将该字段转换为数组字段。我们来看如下的例子:
POST _ingest/pipeline/_simulate
{
"pipeline": {
"description": "Use dot expander to convert a field with dots into object",
"processors": [
{
"dot_expander": {
"field": "geo.city"
}
}
]
},
"docs": [
{
"_source": {
"geo": {
"city": "Shanghai"
},
"geo.city": "Beijing"
}
}
]
}
上面的结果显示:
{
"docs" : [
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"geo" : {
"city" : [
"Shanghai",
"Beijing"
]
}
},
"_ingest" : {
"timestamp" : "2021-06-26T04:14:09.575254Z"
}
}
}
]
}
如果 leaf field 之外的任何字段与同名的预先存在的字段冲突,则需要先重命名该字段。比如:
{
“geo": "Shanghai",
"geo.city": "Beijing"
}
然后在应用 dot_expander 处理器之前需要先重命名 geo 。 因此,为了将 geo.city 字段正确扩展到 geo 字段下的 city 字段,应使用以下 pipelines:
POST _ingest/pipeline/_simulate
{
"pipeline": {
"description": "Use dot expander to convert a field with dots into object",
"processors": [
{
"rename": {
"field": "geo",
"target_field": "geo.city"
}
},
{
"dot_expander": {
"field": "geo.city"
}
}
]
},
"docs": [
{
"_source": {
"geo": "Shanghai",
"geo.city": "Beijing"
}
}
]
}
运行上面的命令。它显示的结果为”
{
"docs" : [
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"geo" : {
"city" : [
"Shanghai",
"Beijing"
]
}
},
"_ingest" : {
"timestamp" : "2021-06-26T04:21:17.33313Z"
}
}
}
]
}
以上是关于Elasticsearch:Dot expander processor - 将带点的字段 foor.bar 扩展为 Object的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的系统 ld 脚本使用像“dot = dot”这样的表达式?