Elasticsearch:Dot expander processor
2021年6月26日 | by mebius
在我之前的文章 “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": "tgcodeBeijing"
}
}
]
}
上面的结果显示:
{
"docs" : [
{
"doc" : {
"_index" : "_index",
"_type" : "_doc",
"_id" : "_id",
"_source" : {
"geo" : {
"city" : [
"Shanghai",
"Beijing"
]
}
},
"_ingest" : {
"timestamp" : "2021-06-26T04:14:09.575254Z"
}
}
}
]
}
如果 leaf field tgcode之外的任何字段与同名的预先存在的字段冲突,则需要先重命名该字段。比如:
{
“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": {
"tgcodegeo": "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
相关推荐: Elasticsearch:如何在导入时忽略格式错误的数据
有时,你对收到的数据没有太多控制权。 一个用户可以发送一个日期形式的 login 字段,另一个用户发送一个电子邮件地址形式的 login 字段。 默认情况下,尝试将错误的数据类型索引到字段中会引发异常,并拒绝整个文档。 ignore_malformed 参数如…