2015-09-25 88 views
2

我想更新logdate列,以查找特定索引中的所有记录。从我目前阅读的内容看来,这似乎是不可能的?我是对的?ElasticSearch中的更新记录

这里有一个文件的样本:

{ 
      "_index": "logstash-01-2015", 
      "_type": "ufdb", 
      "_id": "AU__EvrALg15uxY1Wxf9", 
      "_score": 1, 
      "_source": { 
       "message": "2015-08-14 06:50:05 [31946] PASS level2  10.249.10.70 level2  ads  http://ad.360yield.com/unpixel.... GET", 
       "@version": "1", 
       "@timestamp": "2015-09-24T11:17:57.389Z", 
       "type": "ufdb", 
       "file": "/usr/local/ufdbguard/logs/ufdbguardd.log", 
       "host": "PROXY-DEV", 
       "offset": "3983281700", 
       "logdate": "2015-08-14T04:50:05.000Z", 
       "status": "PASS", 
       "group": "level2", 
       "clientip": "10.249.10.70", 
       "category": "ads", 
       "url": "http://ad.360yield.com/unpixel....", 
       "method": "GET", 
       "tags": [ 
        "_grokparsefailure" 
       ] 
      } 
     } 
+0

你是什么意思的“更新”?将值更改为其他字符串?将它转换为日期对象而不是字符串?将该值复制到@timestamp?要么 ? –

+0

我希望将logdate字段更改为所有文档的另一个日期。在MySQL中,我会这样做: 'UPDATE logstash SET logdate =“2015-09-20T04:50:05.000Z”' 但是它的ElasticSearch似乎只能通过提供它的_id来更新一个文档。 –

回答

1

你是正确的,这是不可能的。

长期以来一直存在一个公开的问题,要求Update by Query,我不确定它会在很短的时间内实现,因为它对于底层lucene引擎是非常有问题的。它要求删除所有文件并重新索引它们。

一个Update by Query Plugin在github上可用,但它是实验性的,我从来没有尝试过。

0

可以使用partial update API

为了测试它,我创建了一个简单的指标:

PUT /test_index 

然后创建一个文档:

PUT /test_index/doc/1 
{ 
    "message": "2015-08-14 06:50:05 [31946] PASS level2  10.249.10.70 level2  ads  http://ad.360yield.com/unpixel.... GET", 
    "@version": "1", 
    "@timestamp": "2015-09-24T11:17:57.389Z", 
    "type": "ufdb", 
    "file": "/usr/local/ufdbguard/logs/ufdbguardd.log", 
    "host": "PROXY-DEV", 
    "offset": "3983281700", 
    "logdate": "2015-08-14T04:50:05.000Z", 
    "status": "PASS", 
    "group": "level2", 
    "clientip": "10.249.10.70", 
    "category": "ads", 
    "url": "http://ad.360yield.com/unpixel....", 
    "method": "GET", 
    "tags": [ 
     "_grokparsefailure" 
    ] 
} 

现在我可以做一个部分更新的文件有:

POST /test_index/doc/1/_update 
{ 
    "doc": { 
     "logdate": "2015-09-25T12:20:00.000Z" 
    } 
} 

如果我检索文档:

GET /test_index/doc/1 

我会看到logdate属性已更新:

{ 
    "_index": "test_index", 
    "_type": "doc", 
    "_id": "1", 
    "_version": 2, 
    "found": true, 
    "_source": { 
     "message": "2015-08-14 06:50:05 [31946] PASS level2  10.249.10.70 level2  ads  http://ad.360yield.com/unpixel.... GET", 
     "@version": "1", 
     "@timestamp": "2015-09-24T11:17:57.389Z", 
     "type": "ufdb", 
     "file": "/usr/local/ufdbguard/logs/ufdbguardd.log", 
     "host": "PROXY-DEV", 
     "offset": "3983281700", 
     "logdate": "2015-09-25T12:20:00.000Z", 
     "status": "PASS", 
     "group": "level2", 
     "clientip": "10.249.10.70", 
     "category": "ads", 
     "url": "http://ad.360yield.com/unpixel....", 
     "method": "GET", 
     "tags": [ 
     "_grokparsefailure" 
     ] 
    } 
} 

这里是我用来测试它的代码:

http://sense.qbox.io/gist/236bf271df6d867f5f0c87eacab592e41d3095cf

+1

感谢您的回答。我想我没有正确解释。我已经检查过更新API,但是我可以看到的是,您必须提供_id字段才能运行更新。就我而言,我喜欢在所有文档上运行更新以使“logdate”相同。 –