1

我需要更新或刪除多個文檔。如何用Elasticsearch處理多個更新/刪除?

當我更新我這樣做:

  1. 我首先搜索的文件,設置返回的結果有較大的限制(比方說,大小:10000)。
  2. 對於每個返回的文檔,我修改了某些值。
  3. 我對elasticsearch整個修改列表(bulk index)感到不滿。

此操作發生,直到點1不再返回結果。

當我刪除我這樣做:

  1. 我首先搜索的文件,設置一個更大的限制返回的結果(比方說,大小:10000)
  2. 我刪除每一個發現的文件發送到elasticsearch _id document(10000 requests)

此操作重複,直到點1不再返回結果。

這是更新的正確方法嗎?

當我刪除,有沒有辦法,我可以發送幾個ID一次刪除多個文件?

回答

1

刪除和更新,如果你想刪除或按ID更新,你可以使用批量API:

大宗原料藥

批量API可以在單個API調用中執行許多索引/刪除操作 。這可以大大提高索引速度。

可能的操作是索引,創建,刪除和更新。索引和 創建期望在下一行的來源,並具有相同的語義 作爲op_type參數標準索引API(即創建將 失敗,如果一個文件具有相同的索引和類型已經存在, ,而索引將添加或根據需要更換文件)。刪除 不指望下一行中有一個源,並且與標準刪除API具有相同的 語義。 update期望在下一行指定部分 doc,upsert和腳本及其選項。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html

您還可以通過查詢,而不是刪除:

刪除通過查詢API

的通過查詢API刪除允許從一個或多個 指數刪除文件以及基於查詢的一種或多種類型。查詢可以使用簡單的查詢字符串作爲參數或使用在請求正文中定義的查詢DSL提供 。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-delete-by-query.html

+0

在「按查詢刪除」和「批量刪除」(請參閱​​@ Tom83的答案)之間,你會推薦什麼?你用過他們兩個嗎? – 2014-09-03 06:54:42

+0

是的,我用過它們兩個。如果您想要刪除文檔ID的離散列表,批量刪除會更有用。如果您有一個查詢標識要刪除的所有文檔,則按查詢刪除會更好。一如既往,使用哪個取決於你的用例。 – 2014-09-03 14:26:10

+0

不確定這是否適用於當前版本的查詢刪除,但對於我所看到的當前通過查詢刪除使用滾動和批量,因此如果您已經有要刪除的id列表,那麼您可能只應使用批量https:/ /www.elastic.co/guide/en/elasticsearch/plugins/2.2/delete-by-query-plugin-reason.html#_new_delete_by_query_implementation – dege 2016-02-08 11:46:52

4

對於您的海量索引/更新操作,如果您尚未使用(不確定),可以查看bulk api documentation。它是爲這種工作量身定製的。

如果您想要小批量檢索大量文檔,則應該使用scan-scroll搜索,而不是使用from/size。相關信息可以在here找到。

綜上所述:

  • scroll API用於加載在存儲器中的結果,並能有效地遍歷它
  • scan搜索類型禁止排序,這是昂貴的

試一試,取決於數據量,它可以提高批量操作的性能。

對於刪除操作,您可以使用同一個_bulk api一次發送多個刪除操作。

每一行的格式如下:

{ "delete" : { "_index" : "indexName", "_type" : "typeName", "_id" : "1" } } 
{ "delete" : { "_index" : "indexName", "_type" : "typeName", "_id" : "2" } } 
+0

看來我不能用掃描滾動,因爲更新將更改用於返回結果的字段的值。所以我總是使用{from:0}並改變「size」參數來減少請求。但是,知道未來很好。批量刪除是我正在尋找的。在「通過查詢刪除」和「批量刪除」之間,你會推薦什麼? – 2014-09-03 06:46:33

+0

由於您希望刪除所有匹配一個查詢的文檔,爲了方便起見,我會使用查詢刪除方式:您可以跳過第一步(檢索匹配文檔的所有ID)。我不知道表演。 – ThomasC 2014-09-03 11:37:13