天天看點

elasticsearch指定文檔id由輸入字段兩個或多個以上組成項目場景:問題描述:原因分析:解決方案:

項目場景:

在使用elasticsearch時,常常會遇到需要指定文檔id的場景,當文檔id是由輸入字段兩個或多個以上組成的時候,這時候就犯了難。那麼怎麼處理呢?

問題描述:

文檔id: 假設文檔id由userid 和 queryTime組成,輸入json字段屬性為userid,username,queryTime,event 組成。這時候如何在不改變json字元串的基礎上完成文檔id由userid 和 queryTime組成的轉變?

原因分析:

json字元串無法改變,elasticsearch7的特性是文檔id要麼預設産生要麼指定文檔id需要在輸入内容上有特定字段進行指定。是以問題很簡單了。

解決方案:

首先,和上司打個申請,申請輸入elasticsearch裡面的内容需要改變,需要加上一個"Lid"對應文檔id,然後,嗯。。。。。。。用scala舉個栗子吧。

既然中繼資料無法改變,而在elasticsearch中需要添加字段,那麼,就加一個dataframe進行中轉。

令:

val df = spark.read.format("json").option("header","true")load("file:///opt/a.json")
           
val newdf: DataFrame = df.withColumn("Lid",concat($"user_id",lit("_"),$"query_time"))
           
這一步操作就是使用mapping方法把文檔id轉變為指定Lid,固定寫法,不要想太多,尤其是,哎呀呀,不應該是_id嘛,“_”呢,别想太多就是id。mapping是一種專門對索引進行管理的函數。還有,也别想着改,索引錯了隻能删庫重來。
 val cfg = Map("es.mapping.id"->"Lid")
EsSparkSQL.saveToEs(newdf, "index/type",cfg)
           

繼續閱讀