如何使用python检查来自API的数据是否在elasticsearch索引中,如果不是,则将其插入

时间:2018-09-26 15:25:46

标签: python elasticsearch openweathermap

我将从Open Weather Map API中检索一些数据,然后使用Python将它们插入Elasticsearch索引中。然后,我将使用一些新的,并检查它们是否已在索引中。如果不是,我将它们添加到索引中。如果已经在其中,则应将其忽略。

import datetime
from pprint import pprint
import requests
import urllib
import json
import request
from elasticsearch import Elasticsearch
from elasticsearch import helpers
import time

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
r = requests.get('http://api.openweathermap.org/data/2.5/weather?q=London&appid=###').json()
pprint(r)

res = es.search(index="weathermap", body={"query": {"match_all": {}}})

for m in res:
   if m not in res:
      es.index(index='weathermap', doc_type='doc')

2 个答案:

答案 0 :(得分:0)

您可以让Elastic为您完成所有操作,而不是检查它是否存在并添加它(如果不存在)。您可以按照文档but this uses more resources in the long run, can cause unexpected behavior and should be avoided中的说明调用es.index(...)来代替使用es.create(...)

  

在特定索引中添加类型化的JSON文档,使其可搜索。   该方法在后台调用index(…,op_type ='create')

来自create

  

索引操作还接受op_type,可用于强制执行   create操作,允许“如果不存在”行为。当create   如果使用该ID的文档,则使用索引操作将失败   索引中已经存在。

因此,如果未插入它将抛出错误,因此请务必进行处理。

答案 1 :(得分:0)

您可以使用以下代码

import datetime
from pprint import pprint
import requests
import urllib
import json
import request
from elasticsearch import Elasticsearch
from elasticsearch import helpers
import time

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
r = requests.get('http://api.openweathermap.org/data/2.5/weather?q=London&appid=###').json()
pprint(r)

res = es.search(index="weathermap", body={"query": {"match_all": {}}})

for m in res['hits']['hits']:
   if search_value not in res:
      es.index(index='weathermap', doc_type='doc',whole_doc_body)