當前位置:首頁 » 網頁前端 » es腳本里的painless
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

es腳本里的painless

發布時間: 2023-06-04 19:43:43

1. 在ES中對索引文檔進行更新

ElasticSearch的文檔寫入是以不可修改的形式寫入的,一條文檔記錄一旦被寫入其本身就不能被修改了。然而,現實中存在修改這些數據的需求,那怎麼辦呢?當上帝給你關上一扇門的時候,他一定給你留了一叢知個窗口。雖然我們不能直接修改這個文檔本身,但是我們可以通過更新一條 _id 一樣的文檔,並更新版本號的方式來修改這條記錄。我們可以通過三種姿勢進行更新。

按順序執行上面的三條put操作,然後查詢,我們可以看到相應的查詢結果是:

可以看到每次put之後,版本號都會遞增1位,同時後面的數據會覆蓋之前的數據。

如果我並不想每次都通過這樣把全部文檔內容再輸入一次的形式來,而是希望基於前一個版本的文檔進行增減或者修改,那又應該怎麼做呢。ES為我們提供了update API。

ES 提供了update API,使我們可以針對某個id的文檔,進行局部更新。我們可以使用painless腳本或者直接在update中設置doc欄位的參數的形式進行。

考慮以下文檔。

如果我想修改年齡的話,可以有兩種方法來進行:

兩種方法都可以將age修改為14。

如果我們想增加一個屬性」weight「該怎麼做呢?

如果我們想移除」sex「欄位,這種情況下,只能用painless腳本了。

這三種情況是最基本的,還有一些其他用法,可以參考update的官方文檔。

https://www.elastic.co/guide/en/elasticsearch/reference/7.2/docs-update.html

需要注意,使用update api只能使用ES索引的內置版本號,如果強行指定版本號,update操作會發生錯誤。

上面兩種方法需要指定文檔id,ES還提供了基於search的update API,及update_by_query API。

update_by_query API的第一種使用方式是什麼都不指定,直接使用。

我一開始看到這種用法,覺得特別疑惑,因為這樣做除了更新了版本號,似乎也沒有什麼變化。後來讀了官方文檔才了解到這種用法的含義。

在設置索引配置的時候,有一個 dynamic 屬性,如果設置成false的話,如果碰到沒有事先映射過的欄位握模,是不會做索引,搜索不到的。需要注意,是搜索不到,但不是沒有存儲,這個數據還是在的。那怎樣能使得這個數據能夠被索引到呢,這個時候update_by_query就能排上用場了。我們先更新這個索引的mapping,然後調用update_by_query API。對應的文檔會重新索引一次,之前不能滲皮消搜索的欄位就變得能夠被搜索到了。

和query API一樣,update_by_query也可以擁有一個query塊,作為update的條件出現:

同樣也可以使用painless進行update操作。

在進行update_by_query的時候,還可以指定pipeline,使用pipeline的處理器處理文檔。

還有一些其他用法,可以參考官方文檔:

https://www.elastic.co/guide/en/elasticsearch/reference/7.2/docs-update-by-query.html