文章目录
1. Ingest pipelines说明
- Ingest pipelines可以在写入数据之前执行一些常见的数据转换。比如说,你可以使用pipelines去移除字段、从文本中提取数据、还可以去丰富你的数据
- 一个pipeline由一系列可配置的processor处理器组成,每个processor按照顺序运行,让传入的文档进行指定的改变,处理器运行之后,elasticsearch添加转换后的文档到你的数据流或者索引中
2. 创建和管理pipelines
- 可以在kibana中,主菜单下 Stack Management > Ingest Node Pipelines中可以管理pipelines
- 可以使用命令行api去创建和管理pipelines
2.1 命令行创建pipelines(append、set、split、trim、sort)
此处举例创建一个名字为my-pipeline的管道
(1)append:如果这个字段存在并且它是一个数组,那么将会添加一个或多个values给一个已经存在的数组;如果这个字段不存在,那么就会创建一个包含这些值的数组。注意{{{ }}}可以动态取出文档中的字段值
(2)set:设置一个字段为指定值(如果该字段已经存在,则该字段值将会被替换)
(3)split:将字符串按照分隔符分隔成为一个数组
(4)trim:去除空白符。如果这个字段是字符串数组,那么里面所有的元素都会被trim
(5)sort:数组元素asc或desc排序
#创建管道
PUT /_ingest/pipeline/my-pipeline
{
"description": "mt pipeline test",
"processors": [
{
"append": {
"field": "extendParams.appendParam",
"value": "appendValue"
}
},
{
"set": {
"field": "typeName",
"value": "电影",
"if": " ctx.type==1"
}
},
{
"set": {
"field": "typeName",
"value": "电视剧",
"if": " ctx.type==2"
}
},
{
"split": {
"field": "tags",
"separator": ","
}
},
{
"trim": {
"field": "tags"
}
},
{
"append": {
"field": "extendParams.nameAndTagsParam",
"value": [
"aa",
"{{{name}}}",
"{{{typeName}}}"
]
}
},
{
"sort": {
"field": "weight",
"order": "desc"
}
}
]
}
# 使用管道添加数据
PUT /my-pipeline-index/_doc/1?pipeline=my-pipeline
{
"id":1,
"name":"战狼",
"type": 1,
"tags":"动作 , 爱情 ,爱国 ,,,",
"weight":[1,5,3,7,2,8,0]
}
# 最终结果
{
...
"hits" : {
...
"hits" : [
{
"_index" : "my-pipeline-index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"extendParams" : {
"nameAndTagsParam" : [
"aa",
"战狼",
"电影"
],
"appendParam" : [
"appendValue"
]
},
"name" : "战狼",
"typeName" : "电影",
"weight" : [
8,
7,
5,
3,
2,
1,
0
],
"id" : 1,
"type" : 1,
"tags" : [
"动作",
"爱情",
"爱国"
]
}
}
]
}
}
2.2 enrich process
可以使用enrich processor从已经存在的索引中添加数据给传入的相关文档
2.2.1 enrich processor工作原理
- enrich policy
是一套用来给传入文档添加正确的丰富数据的配置选项
一个enrich policy包括:
(1)一个或多个源索引(存储丰富数据)
(2)策略类型(决定处理器如何匹配填充数据与传入文档)
(3)源索引中用来匹配传入文档的字段
(4)源索引中你想要添加给传入文档的填充数据字段 - source index
源索引
存储要添加到传入文档中的丰富数据的索引 - enrich index
(1)将传入文档与源索引直接匹配的效率是低下的,为了提升速度,enrich processor会使用enrich index
(2)enrich index包含来自源索引的丰富数据,但具有一些特殊属性来帮助简化它们:
(a) 它们是系统索引,意味着它们由es内部管理,仅仅使用在enrich processors
(b) 它们总是以.enrich-*开头
(c) 它们是只读的
(d) 它们被强制合并为了快速检索
2.2.2 enrich 举例(基于精确值)
- 文档创建
PUT /users/_doc/1?refresh=wait_for
{
"email": "mardy.brown@asciidocsmith.com",
"first_name": "Mardy",
"last_name": "Brown",
"city": "New Orleans",
"county": "Orleans",
"state": "LA",
"zip": 70116,
"web": "mardy.asciidocsmith.com"
}
- 使用create enrich policy API创建一个match类型的enrich policy,这个策略必须包括:
(1)一个或多个源索引
(2)一个匹配字段,该字段来自源索引,用来匹配传入文档
(3)想要从源索引添加给传入文档的丰富数据字段
PUT /_enrich/policy/users-policy
{
"match": {
"indices": "users",
"match_field": "email",
"enrich_fields": ["first_name", "last_name", "city", "zip", "state"]
}
}
- 使用 execute enrich policy API去创建一个丰富索引
POST /_enrich/policy/users-policy/_execute
- 使用创建pipeline api去创建ingest pipeline,在这个pipeline中,添加一个enrich processor,包括:
(1)enrich policy
(2)field:传入文档中用来匹配enrich index文档的字段
(3)target_field:用为传入文档存储填充数据。这个字段包含enrich policy中指定的match_field、enrich_fields
PUT /_ingest/pipeline/user_lookup
{
"processors" : [
{
"enrich" : {
"description": "Add 'user' data based on 'email'",
"policy_name": "users-policy",
"field" : "email",
"target_field": "user",
"max_matches": "1"
}
}
]
}
- 验证、结果
使用上面创建的pipeline,添加文档
PUT /my-index-000001/_doc/my_id?pipeline=user_lookup
{
"email": "mardy.brown@asciidocsmith.com"
}
查看这个文档
GET /my-index-000001/_doc/my_id
结果
{
"found": true,
"_index": "my-index-000001",
"_type": "_doc",
"_id": "my_id",
"_version": 1,
"_seq_no": 55,
"_primary_term": 1,
"_source": {
"user": {
"email": "mardy.brown@asciidocsmith.com",
"first_name": "Mardy",
"last_name": "Brown",
"zip": 70116,
"city": "New Orleans",
"state": "LA"
},
"email": "mardy.brown@asciidocsmith.com"
}
}