使用 Python API 通过映射将 CSV 加载到 elasticsearch 索引

Loading CSV to elasticsearch index with mapping using Python API

使用 elasticsearch Python API 我想创建一个带有映射的 elasticsearch 索引,这样当我上传 CSV 文件时,文档就会根据这个映射上传。

import argparse, elasticsearch, json
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk
import csv

我有这个(我删除了一些字段所以映射看起来不那么长):

mapping = 
'''{
"mappings": {
  "type": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "@version": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "authEndStopCode": {
        "type": "keyword"
      },
      "expandedTripNumber": {
        "type": "integer"
      },
      "operator": {
        "type": "integer"
      },
      "path": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "startStopName": {
        "type": "keyword"
      },
      "userStartStopCode": {
        "type": "keyword"
      }
    }
  }
}
}'''

我是这样创建索引的:

es.indices.create(index=INDEX_NAME, ignore=400, body=mapping)

这是我上传数据的方式:

with open(args.file, "r", encoding="latin-1") as f:
    reader = csv.DictReader(f)
    bulk(es, reader, index=INDEX_NAME, doc_type=TYPE)

其中 INDEX_NAMETYPE 是我已经定义的字符串。

CSV 文件只是数据(应该是每行一个文档),没有 headers,但 elasticsearch 似乎试图将第一行用作 headers。我不想要这个,我想使用我已经添加到索引中的映射。

希望有人能提供帮助。谢谢你。

问题不大。 csv.DictReader 总是从文件中读取第一行以获得后续行的 headers。因此,如果您要使用 DictReader,该文件需要 header.

我是 moshe/elasticsearch_loader
的作者 我为这个确切的问题写了 ESL。
可以用pip下载:

pip install elasticsearch-loader

然后您将能够在通过发出以下命令提供自定义映射的同时将 csv 文件加载到 elasticsearch 中:

elasticsearch_loader  --index-settings-file mappings.json \
     --index incidents --type incident csv file1.csv