- 定义ES连接类
class ES_conn:
def __init__(self):
es_conf_psth = os.path.join(get_project_root_path(), 'config', 'db.conf')
es_conf = Config(es_conf_psth)
self.host = es_conf.get_option_val('es', 'host')
self.port = es_conf.get_option_val('es', 'port')
self.es = Elasticsearch(hosts=self.host.split(','), port=self.port)
其中self.es = Elasticsearch(hosts=self.host.split(‘,’), port=self.port)中,hosts参数接收的是一个字符串列表,例如[‘192.168.16.96’,‘192.168.16.97’,‘192.168.16.98’]等,端口是9200
- 创建一个带有geo_shape字段类型的索引。(仅执行一次)
es_conn = ES_conn()
index_name = "my_index"
if es_conn.es.indices.exists(index=index_name):
es_conn.es.indices.delete(index=index_name)
mappings = {
"properties": {
"location": {
"type": "geo_shape"
}
}
}
# 创建新的索引,并定义映射
es_conn.es.indices.create(index=index_name, mappings=mappings)
doc_body = {
"objectid": "123456",
"location": {
"type": "point",
"coordinates": [121.163214, 31.621541]
}
}
# 插入一条数据
es_conn.es.index(index=index_name, id=1, body=doc_body)
- 插入一条数据以后
可以利用
mapping = es_conn.es.indices.get_mapping(index=index_name)
print(mapping)
来检查location字段是不是geo_shape类型
- 定义查询
s = Search(using=es_conn.es, index=index_name)
# 不规则多边形范围查询
s = s.filter('geo_shape', location={'relation': 'intersects',
'shape': {'type': 'polygon', 'coordinates': coords}})
response = s.execute()
其中变量coords是一个三维list列表,用来表示一个多边形顶点坐标,如果你的多边形没有挖孔,那么第一维只有一个元素,否则有多个。