在我之前的文章 “Elasticsearch:使用 pipelines 路由文檔到想要的 Elasticsearch 索引中去” 我詳述了如何使用已有的?date_index_name 處理器來把文檔歸類到所需要的和文檔日期相關(guān)的的索引中去。比如,我們想把 2023 年 4 月的所有文檔寫入到?my-index-2023-04-01 這個(gè)索引名稱中去。這個(gè)處理器很好地解決了在很多情況下,我們需要把當(dāng)月或者當(dāng)年的索引放到我們需要的以文檔時(shí)間戳相關(guān)索引名稱中,這樣便于以后的管理及搜索。
在今天的文章中,我們將以另外一種方式來實(shí)現(xiàn)同樣的方案。
各種不同的方法來修改數(shù)據(jù)
在 Elastic Stack 中的使用中,我們有許多不同的方案來修改數(shù)據(jù),比如:
在上面,我們使用定制的微服務(wù)來攝入商業(yè)應(yīng)用文檔,并使用我們的算法來修改文檔,最終通過 client 庫把文檔寫入到 Elasticsearch 中。這種方法的缺點(diǎn)是你需要編寫相應(yīng)的應(yīng)用程序來完成。針對(duì)大量的數(shù)據(jù),我們可能沒有緩沖,有時(shí)我們甚至不能保證至少一次傳輸。這種在 Logstash 和 Filebeat 中都有實(shí)現(xiàn)。
我們也可以采用 Logstash 來對(duì)數(shù)據(jù)進(jìn)行修改:
?
Logstash 提供了豐富的過濾器來幫助我們處理數(shù)據(jù)。你可以閱讀文章 “Logstash:Logstash 入門教程 (一)” 以了解更多。這種方案的缺點(diǎn)是,為了應(yīng)付 single point of failure 及負(fù)載均衡,你需要管理多個(gè) Logstash 實(shí)例。這個(gè)需要額外的工作。??
在最新的開發(fā)者中,越來越多的開發(fā)者傾向于使用 ingest pipeline 來對(duì)數(shù)據(jù)進(jìn)行處理。更多關(guān)于 ingest pipeline 的文章可以參考 “Elastic:開發(fā)者上手指南”。
Ingest 節(jié)點(diǎn)是 Elasticsearch 集群中的一類節(jié)點(diǎn)。它可以幫我們運(yùn)行豐富的處理器來處理數(shù)據(jù)。由于它是 Elasticsearch 集群的一個(gè)部分,它可以很方便地進(jìn)行擴(kuò)容操作來應(yīng)付更多的需求。?
使用? Ingest pipeline 的好處是:
- 能夠在不改變應(yīng)用程序邏輯的情況下修改數(shù)據(jù)
- 與 Logstash 相比的輕量級(jí)解決方案
- 單獨(dú)管理集群沒有額外開銷
- 降低結(jié)構(gòu)復(fù)雜性
盡管 ingest pipeline 有上面的很多優(yōu)點(diǎn),但是使用 ingest pipeline 也有一些局限性:
- 無法將文檔拆分為多個(gè)文檔([Ingest Pipeline] Ability to split documents · Issue #56769 · elastic/elasticsearch · GitHub)
- 由于攝取管道的性質(zhì),同時(shí)處理多個(gè)文檔時(shí)可能會(huì)遇到挑戰(zhàn)
- 不能和外部的數(shù)據(jù)庫進(jìn)行 join 等操作,也無法訪問外部的數(shù)據(jù)庫并寫入
除了上面所述的修改數(shù)據(jù)的方案中,另外一個(gè)就是通過 Beats processor 來對(duì)數(shù)據(jù)進(jìn)行加工。你可以更進(jìn)一步閱讀 “Beats:Beats processors”。
把數(shù)據(jù)寫入到我們想要的索引中去
我們接下來通過 ingest pipeline 的方法來把我們想要的數(shù)據(jù)寫入到我們想要的索引中去。我們想把
比如在上面,我們可以看到一個(gè)字段叫做 created_at。它是發(fā)生在 2022-11-30 這個(gè)天。我們想把這個(gè)文檔寫入到我們想要的索引名稱中 books.2022.11。道理很簡(jiǎn)單,我們就是想把當(dāng)月的所有文檔歸于同樣的一個(gè)索引名稱 books.2022.11 這個(gè)索引中。以后便于歸檔及搜索。在實(shí)際的生產(chǎn)環(huán)境中,有這種需求。那么我們?cè)撊绾螌?shí)現(xiàn)我們的這種需求呢?
我們采用 ingest pipeline 來實(shí)現(xiàn)這個(gè)需求。我們?cè)?Kibana 中打入如下的命令:
POST _ingest/pipeline/_simulate
{
"pipeline": {
"description": "Change index name according to created_at",
"processors": [
{
"date": {
"field": "created_at",
"target_field": "index_suffix",
"formats": ["ISO8601"],
"output_format": "yyyy.MM"
}
},
{
"set": {
"field": "_index",
"value": "{{ _index }}.{{index_suffix}}"
}
}
]
},
"docs": [
{
"_source": {
"created_at": "2023-04-13T23:57:11.092808962ZZ",
"content": "This is Xiaoguo, Liu from Elastic"
}
}
]
}
運(yùn)行上面的命令,我們看到的結(jié)果是:
{
"docs": [
{
"doc": {
"_index": "_index.2023.04",
"_id": "_id",
"_version": "-3",
"_source": {
"created_at": "2023-04-13T23:57:11.092808962ZZ",
"content": "This is Xiaoguo, Liu from Elastic",
"index_suffix": "2023.04"
},
"_ingest": {
"timestamp": "2023-04-14T00:01:24.74589526Z"
}
}
}
]
}
在上面,由于我們沒有指定?_index,所以測(cè)試的結(jié)果是?_index.2023.04。在下面,如果我們指定 _index,那么就會(huì)自動(dòng)替換我們想要的索引名稱。上面顯示它已經(jīng)是我們想要的結(jié)果。我們可以創(chuàng)建如下的 pipeline:
PUT _ingest/pipeline/change_index_according_to_created_at
{
"description": "Change index name according to created_at",
"processors": [
{
"date": {
"field": "created_at",
"target_field": "index_suffix",
"formats": [
"ISO8601"
],
"output_format": "yyyy.MM"
}
},
{
"set": {
"field": "_index",
"value": "{{ _index }}.{{index_suffix}}"
}
}
]
}
運(yùn)行完上面的命令后,我們使用如下的命令來做測(cè)試:
PUT books/_doc/1?pipeline=change_index_according_to_created_at
{
"created_at": "2023-04-13T23:57:11.092808962ZZ",
"content": "This is Xiaoguo Liu from Elastic"
}
上面的命令返回的結(jié)果為:
{
"_index": "books.2023.04",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
如上所示,我們的 _index 名稱現(xiàn)在變?yōu)?books.2023.04,而不是在寫入時(shí)的 books。我們可以通過如下的命令來進(jìn)行查詢剛才寫入的數(shù)據(jù):
GET books.2023.04/_search
上面的命令返回:文章來源:http://www.zghlxwxcb.cn/news/detail-472525.html
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "books.2023.04",
"_id": "1",
"_score": 1,
"_source": {
"created_at": "2023-04-13T23:57:11.092808962ZZ",
"content": "This is Xiaoguo Liu from Elastic",
"index_suffix": "2023.04"
}
}
]
}
}
其實(shí)安裝同樣的套路,通過修改 _index,我們可以任意組合我們的索引名稱。在生產(chǎn)環(huán)境中,我們更希望使用帶有日期標(biāo)簽的名稱來標(biāo)識(shí)我們的索引!文章來源地址http://www.zghlxwxcb.cn/news/detail-472525.html
到了這里,關(guān)于Elasticsearch:使用 ingest pipeline 來管理索引名稱的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!