Python Elasticsearch不接受数据主体

时间:2018-11-28 17:03:06

标签: python elasticsearch

我基本上是试图索引来自csv文件的数据帧中的数据。

我成功创建了索引。

es.indices.create(index='hash_test', ignore=400)

并添加基线索引,其中包含我的数据框中包含的列和示例数据

       es.index(index="hash_test", doc_type="hash-test", id=rand_id, body={
         'FILENAME': '6.js', 
         'HASH': 'b4d44ed618112e41cb7e8f33bb19a414', 
         'DATE': '2018-11-15'})

哪一个还好。

下面是我想如何将我的数据帧解析为正确的格式,并遍历行并将数据索引到Elasticsearch中,类似于上面的方法。

def index_data(data_path, chunksize, index_name, doc_type):
    f = open(data_path)
    csvfile = pd.read_csv(f, iterator=True, chunksize=chunksize,sep="£",encoding="utf-8-sig",index_col=0,engine="python") 
    dictionary = {'Â':''}
    es = Elasticsearch('http://*.*.*.*:9200/')

    for i,df in enumerate(csvfile):
        rand_id = uuid.uuid4();
        df.replace(dictionary, regex=True, inplace=True)
        df.columns = df.columns.str.replace('Â', '')
        records=df.where(pd.notnull(df),None).T.to_dict()
        list_records=[records[it] for it in records]
        json_data = str(''.join(str(v) for v in list_records))
        try:
            es.index(index_name, doc_type, rand_id, json_data)
        except:
            print("error!")
            pass

我必须对数据帧进行一些解析,因为每一行和每一列(Â)中都有一个奇怪的字符。

当我打印要索引的值时

print(index_name, doc_type, rand_id, json_data)

我得到了我想要的

hash_test hash-test 51eacee2-e2b1-4886-82f5-1373ec59c640 {'FILENAME': '6.js', 'HASH': 'b4d44ed618112e41cb7e8f33bb19a414', 'DATE': '2018-11-15'}

但是运行它时出现以下错误;

RequestError: RequestError(400, 'mapper_parsing_exception', 'failed to parse')

正在尝试放置以下数据:

{"_index":"hash_test","_type":"hash-test","_id":"{'FILENAME': '8.js', 'HASH': 'b4d44ed618112e41cb7e8f33bb19a414', 'DATE': '2018-11-15'}","found":false}

当我执行以下操作时,它将完全忽略rand_id参数:

es.index(index_name, doc_type, json_data, rand_id)

它忽略了json_data参数.....

{"_index":"hash_test","_type":"hash-test","_id":"93eadd1b-6859-474b-9750-b618b800b4d5","found":false}

我不明白我得到的输出的差异,当我指定id参数时,我对主体在_id字段中的结局感到困惑。

请提前帮忙。

1 个答案:

答案 0 :(得分:0)

因此,毫不奇怪,我通过从数据帧中创建干净的JSON字符串使我需要做的事情复杂化了。我学会了使用熊猫中的to_json函数要容易得多,而不是使用字典然后使用列表(我想这是我的错误的根源)。

下面的代码将其清除,并将我的数据帧索引到我的Elasticsearch实例中。

def index_data(data_path, chunksize, index_name, doc_type):
    f = open(data_path)
    csvfile = pd.read_csv(f, iterator=True, chunksize=chunksize,sep="£",encoding="utf-8-sig",index_col=0,engine="python") 
    es = Elasticsearch('http://*.*.*.*:9200/')

    for i,df in enumerate(csvfile):
        rand_id = uuid.uuid4(); #create a random id
        data=df.to_json(orient='records', lines=True)
        try:
            es.index(index=index_name,doc_type=doc_type,id=rand_id,body=data)
        except TransportError as e:
            print(e.info)