【问题标题】:Index CSV to ElasticSearch in Python在 Python 中将 CSV 索引到 ElasticSearch
【发布时间】:2017-05-25 05:24:09
【问题描述】:

希望在不使用 Logstash 的情况下将 CSV 文件索引到 ElasticSearch。 我正在使用elasticsearch-dsl 高级库。

例如,给定一个带有标题的 CSV:

name,address,url
adam,hills 32,http://rockit.com
jane,valleys 23,http://popit.com

按字段索引所有数据的最佳方法是什么?最终我希望让每一行看起来像这样

{
"name": "adam",
"address": "hills 32",
"url":  "http://rockit.com"
}

【问题讨论】:

  • 看起来elasticsearch-dsl 依赖于elasticsearch-py 库。查看 elasticsearch-py's docs 以了解如何插入文档的示例。
  • 问题不在于索引文档,而是关于如何将整个 .csv 文件索引到 elasticsearch 中的技术

标签: python csv elasticsearch python-3.5 elasticsearch-dsl


【解决方案1】:

使用较低级别的elasticsearch-py 库可以更轻松地完成此类任务:

from elasticsearch import helpers, Elasticsearch
import csv

es = Elasticsearch()

with open('/tmp/x.csv') as f:
    reader = csv.DictReader(f)
    helpers.bulk(es, reader, index='my-index', doc_type='my-type')

【讨论】:

  • 这是我一直在寻找的答案,我会在几个小时内尝试并做出相应的回应,谢谢!
  • 正是我正在寻找的 Pythonic 和优雅的解决方案 - 谢谢!
  • 那映射怎么做才能知道每个字段的类型?
  • @shinz4u 只需将阅读器包装在一些内容中,将所需的id 添加为字典中的_id 键,然后它将被 elasticsearch 占用
  • @seamaner 这只是意味着弹性搜索无法足够快地处理您发送的数据。您可以通过在实例化时将timeout=N 传递给Elasticsearch 来增加超时(默认为10 秒)(其中N > 10)
【解决方案2】:

如果您想使用严格的类型和模型从 .tsv/.csv 创建 elasticsearch 数据库以进行更好的过滤,您可以这样做:

class ElementIndex(DocType):
    ROWNAME = Text()
    ROWNAME = Text()

    class Meta:
        index = 'index_name'

def indexing(self):
    obj = ElementIndex(
        ROWNAME=str(self['NAME']),
        ROWNAME=str(self['NAME'])
    )
    obj.save(index="index_name")
    return obj.to_dict(include_meta=True)

def bulk_indexing(args):

    # ElementIndex.init(index="index_name")
    ElementIndex.init()
    es = Elasticsearch()

    //here your result dict with data from source

    r = bulk(client=es, actions=(indexing(c) for c in result))
    es.indices.refresh()

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2021-07-19
    • 2018-02-22
    • 2018-10-04
    • 2020-01-24
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多