本篇文章為大家展示了Elasticsearch 預(yù)處理的技巧示例分析,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的江山網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
es可以根據(jù)_id字符串切分,再聚合統(tǒng)計(jì)嗎 比如:數(shù)據(jù)1、_id=C12345 數(shù)據(jù)2、_id=C12456 數(shù)據(jù)3、_id=C31268
通過es聚合統(tǒng)計(jì) C1開頭的數(shù)量有2個(gè) C3開頭的數(shù)據(jù)有1個(gè)
這個(gè)API怎么寫,有大佬指導(dǎo)下嗎?
插入的時(shí)候,能不能對(duì)原數(shù)據(jù)進(jìn)行一定的轉(zhuǎn)化,再進(jìn)行indexing
{
"headers":{
"userInfo":[
"{ \"password\": \"test\",\n \"username\": \"zy\"}"
]
}
}
這里面的已經(jīng)是字符串了,能在數(shù)據(jù)插入階段把這個(gè) json 轉(zhuǎn)成 object 么?
我想對(duì)一個(gè)list每個(gè)值后面都加一個(gè)字符:
比如 {"tag":["a","b","c"]} 這樣一個(gè)文檔 我想變成 {"tag":["a2","b2","c2"]} 這樣的,
各位有沒有試過用 foreach 和 script 結(jié)合使用?
「問題 1」:分析環(huán)節(jié)需要聚合統(tǒng)計(jì),當(dāng)然用painless script 也能實(shí)現(xiàn),但數(shù)據(jù)量大,勢(shì)必有性能問題。
可以把數(shù)據(jù)處理前置,把前_id兩個(gè)字符提取出來,作為一個(gè)字段處理。
「問題 2」:寫入的時(shí)候期望做字符類型的轉(zhuǎn)換,把復(fù)雜的字符串轉(zhuǎn)換為格式化后的 Object 對(duì)象數(shù)據(jù)。
「問題 3」:數(shù)組類型數(shù)據(jù)全部規(guī)則化更新,當(dāng)然 painless script 腳本也可以實(shí)現(xiàn)。
但是,在寫入環(huán)節(jié)處理,就能極大減輕后面分析環(huán)節(jié)的負(fù)擔(dān)。
以上三個(gè)問題,寫入前用 java 或者 python 寫程序處理,然后再寫入 Elasticsearch 也是一種方案。
但,如果要死磕一把,有沒有更好的方案呢?能否在寫入前進(jìn)行數(shù)據(jù)的預(yù)處理呢?
一般情況下,我們程序?qū)懭霐?shù)據(jù)或者從第三方數(shù)據(jù)源(MySQL、Oracle、HBase、Spark等)導(dǎo)入數(shù)據(jù),都是原始數(shù)據(jù)張什么樣,直接批量同步 ES,寫入ES索引化的數(shù)據(jù)就是什么樣。如下圖所示:
如前所述的三個(gè)實(shí)戰(zhàn)問題,實(shí)際業(yè)務(wù)數(shù)據(jù)可能不見得是我們真正分析環(huán)節(jié)所需要的。
需要對(duì)這些數(shù)據(jù)進(jìn)行合理的預(yù)處理后,才便于后面環(huán)節(jié)的分析和數(shù)據(jù)挖掘。
數(shù)據(jù)預(yù)處理的步驟大致拆解如下:
主要是為了去除 重復(fù)數(shù)據(jù),去噪音(即干擾數(shù)據(jù))以及填充缺省值。
將多個(gè)數(shù)據(jù)源的數(shù)據(jù)放在一個(gè)統(tǒng)一的數(shù)據(jù)存儲(chǔ)中。
將數(shù)據(jù)轉(zhuǎn)化成適合數(shù)據(jù)挖掘或分析的形式。
在 Elasticsearch 中,有沒有預(yù)處理的實(shí)現(xiàn)呢?
Elasticsearch的ETL利器——Ingest節(jié)點(diǎn),已經(jīng)將節(jié)點(diǎn)角色劃分、Ingest 節(jié)點(diǎn)作用,Ingest 實(shí)踐、Ingest 和 logstash 預(yù)處理優(yōu)缺點(diǎn)對(duì)比都做了解讀。有相關(guān)盲點(diǎn)的同學(xué),可以移步過去過一遍知識(shí)點(diǎn)。
Ingest 節(jié)點(diǎn)的本質(zhì)——在實(shí)際文檔建立索引之前,使用 Ingest 節(jié)點(diǎn)對(duì)文檔進(jìn)行預(yù)處理。Ingest 節(jié)點(diǎn)攔截批量索引和單個(gè)索引請(qǐng)求,應(yīng)用轉(zhuǎn)換,然后將文檔傳遞回單個(gè)索引或批量索引API 寫入數(shù)據(jù)。
下面這張圖,比較形象的說明的 Elasticsearch 數(shù)據(jù)預(yù)處理的流程。
實(shí)際業(yè)務(wù)場(chǎng)景中,預(yù)處理步驟如下:
根據(jù)實(shí)際要處理的復(fù)雜數(shù)據(jù)的特點(diǎn),有針對(duì)性的設(shè)置1個(gè)或者多個(gè) pipeline (管道),上圖的粉紅和黃色部分。
寫入數(shù)據(jù)、更新數(shù)據(jù)或者 reindex 索引環(huán)節(jié),指定要處理索引的 pipeline , 實(shí)際就是寫入索引與上面的 pipeline0 和 pipelineZ 關(guān)聯(lián)起來。
劃重點(diǎn):Ingest 實(shí)現(xiàn)在實(shí)際文檔編制索引(索引化)之前對(duì)文檔進(jìn)行預(yù)處理。
PUT _ingest/pipeline/split_id
{
"processors": [
{
"script": {
"lang": "painless",
"source": "ctx.myid_prefix = ctx.myid.substring(0,2)"
}
}
]
}
借助 script 處理器中的 substring 提取子串,構(gòu)造新的前綴串字段,用于分析環(huán)節(jié)的聚合操作。
PUT _ingest/pipeline/json_builder
{
"processors": [
{
"json": {
"field": "headers.userInfo",
"target_field": "headers.userInfo.target"
}
}
]
}
借助 json 處理器做字段類型轉(zhuǎn)換,字符串轉(zhuǎn)成了 json。
PUT _ingest/pipeline/add_builder
{
"processors": [
{
"script": {
"lang": "painless",
"source": """
for (int i=0; i < ctx.tag.length;i++) {
ctx.tag[i]=ctx.tag[i]+"2";
}
"""
}
}
]
}
借助 script 處理器,循環(huán)遍歷數(shù)組,實(shí)現(xiàn)了每個(gè)數(shù)組字段內(nèi)容的再填充。
篇幅原因,更詳細(xì)解讀參見:
https://github.com/mingyitianxia/deep_elasticsearch/blob/master/es_dsl_study/1.ingest_dsl.md
「方案 1」:數(shù)據(jù)原樣導(dǎo)入Elasticsearch,分析階段再做 painless 腳本處理。簡(jiǎn)單粗暴。
導(dǎo)入一時(shí)爽,處理費(fèi)大勁!
如前所述,script 處理能力有限,且由于 script 徒增性能問題煩惱。
不推薦使用。
「方案 2」:提前借助 Ingest 節(jié)點(diǎn)實(shí)現(xiàn)數(shù)據(jù)預(yù)處理,做好必要的數(shù)據(jù)的清洗(ETL) 操作,哪怕增大空間存儲(chǔ)(如新增字段),也要以空間換時(shí)間,為后續(xù)分析環(huán)節(jié)掃清障礙。
看似寫入變得復(fù)雜,實(shí)則必須。「以空間為分析贏取了時(shí)間」。
推薦使用。
默認(rèn)情況下,所有節(jié)點(diǎn)都默認(rèn)啟用 Ingest,因此任何節(jié)點(diǎn)都可以完成數(shù)據(jù)的預(yù)處理任務(wù)。
但是,當(dāng)集群數(shù)據(jù)量級(jí)夠大,集群規(guī)模夠大后,建議拆分節(jié)點(diǎn)角色,和獨(dú)立主節(jié)點(diǎn)、獨(dú)立協(xié)調(diào)節(jié)點(diǎn)一樣,設(shè)置獨(dú)立專用的 Ingest 節(jié)點(diǎn)。
創(chuàng)建索引、創(chuàng)建模板、更新索引、reindex 以及 update_by_query 環(huán)節(jié) 都可以指定 pipeline。
PUT ms-test
{
"settings": {
"index.default_pipeline": "init_pipeline"
}
}
PUT _template/template_1
{
"index_patterns": ["te*", "bar*"],
"settings": {
"number_of_shards": 1,
"index.default_pipeline":"add_builder"
}
}
PUT /my_index/_settings
{
"index" : {
"default_pipeline" : "my_pipeline"
}
}
POST _reindex
{
"source": {
"index": "source"
},
"dest": {
"index": "dest",
"pipeline": "some_ingest_pipeline"
}
}
POST twitter/_update_by_query?pipeline=set-foo
上述內(nèi)容就是Elasticsearch 預(yù)處理的技巧示例分析,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。