基于查询的Elasticsearch upsert

时间:2017-06-06 13:32:54

标签: elasticsearch

两年前有人问how to do upserts when you don't know a document's id。 (未接受的)答案引用了feature request 这导致了_update_by_query API

但是如果没有匹配,_id不允许插入,所以它不是真正的upsert,而只是另一种更新方式。

有没有办法在没有{{1}}的情况下进行upsert?我知道我的查询将始终返回一个或零结果。或者我被迫做多个请求(并保持自己的独特性)?

2 个答案:

答案 0 :(得分:0)

现在似乎不可能。 _update提供了upsert属性,但遗憾的是,这不适用于_update_by_query。以下内容仅为您提供Unknown key for a START_OBJECT in [upsert].

附近的错误消息
POST website/doc/_update_by_query?conflicts=proceed
{
  "query": { 
    "term": {
      "url": "http://foo.com"
    }
  },
  "script": {
    "inline": "ctx._source.views+=1",
    "lang": "painless"
  },
   "upsert": {
       "views": 1,
       "url": "http://foo.com"
   }
}

答案 1 :(得分:0)

现在无需知道所有文档中的 in_stock 值,您可以将其计数减少 1:

POST products/_update_by_query
{
    "script": {
        "source": "ctx._source.in_stock--"
    },
    "query": {
        "match_all": {}
    }
}