csv – 导入和更新Elasticsearch中的数据

我们有一个现有的搜索功能,涉及SQL Server中多个表的数据.这导致我们的数据库重负载,所以我试图找到一个更好的方法来搜索这些数据(它不会变化很多).我一直在使用Logstash和Elasticsearch一个星期,使用的进口包含120万条记录.我的问题本质上是“如何使用我的”主键“更新现有文档?”

CSV数据文件(分隔线)如下所示:

369|90045|123 ABC ST|LOS ANGELES|CA
368|90045|PVKA0010|LA|CA
367|90012|20000 Venice Boulvd|Los Angeles|CA
365|90045|ABC ST 123|LOS ANGELES|CA
363|90045|ADHOCTESTPROPERTY|DALES|CA

我的logstash配置如下所示:

input {
  stdin {
    type => "stdin-type"
  }

  file {
    path => ["C:/Data/sample/*"]
    start_position => "beginning"
  }
}

filter {
  csv {
    columns => ["property_id","postal_code","address_1","city","state_code"]
    separator => "|"
  }
}

output {
  elasticsearch {
    embedded => true
    index => "samples4"
    index_type => "sample"
  }
}

弹性搜索中的文档如下所示:

{
   "_index": "samples4",
   "_type": "sample",
   "_id": "64Dc0_1eQ3uSln_k-4X26A",
   "_score": 1.4054651,
   "_source": {
   "message": [
      "369|90045|123 ABC ST|LOS ANGELES|CA\r"
   ],
   "@version": "1",
   "@timestamp": "2014-02-11T22:58:38.365Z",
   "host": "[host]",
   "path": "C:/Data/sample/sample.csv",
   "property_id": "369",
   "postal_code": "90045",
   "address_1": "123 ABC ST",
   "city": "LOS ANGELES",
   "state_code": "CA"
}

我想要将_id字段中的唯一ID替换为property_id的值.这个想法是后续的数据文件将包含更新.我不需要保留以前的版本,我们不会在文档中添加或删除密钥的情况.

弹性搜索输出的document_id设置不会将该字段的值放入_id(它只是放入“property_id”,只存储/更新一个文档).我知道我在这里缺少一些东西.我只是采取错误的做法?

编辑:工作!

使用@ rutter的建议,我已经将输出配置更新为:

output {
  elasticsearch {
    embedded => true
    index => "samples6"
    index_type => "sample"
    document_id => "%{property_id}"
  }
}

现在文件正在按照预期将新文件放入数据文件夹进行更新. _id和property_id是相同的值.

{
   "_index": "samples6",
   "_type": "sample",
   "_id": "351",
   "_score": 1,
   "_source": {
   "message": [
      "351|90045|Easy as 123 ST|LOS ANGELES|CA\r"
   ],
   "@version": "1",
   "@timestamp": "2014-02-12T16:12:52.102Z",
   "host": "TXDFWL3474",
   "path": "C:/Data/sample/sample_update_3.csv",
   "property_id": "351",
   "postal_code": "90045",
   "address_1": "Easy as 123 ST",
   "city": "LOS ANGELES",
   "state_code": "CA"
}
从评论转换:

您可以通过发送具有相同ID的另一个文档来覆盖文档,但这可能会与您以前的数据相悖,因为您将默认获得随机ID.

您可以使用输出插件的document_id field设置一个ID,但它需要一个字面字符串,而不是字段名称.要使用字段的内容,可以使用sprintf format string,例如%{property_id}.

这样的事情,例如:

output {
  elasticsearch {
    ... other settings...
    document_id => "%{property_id}"
  }
}
翻译自:https://stackoverflow.com/questions/21716002/importing-and-updating-data-in-elasticsearch

转载注明原文:csv – 导入和更新Elasticsearch中的数据