Elasticsearch不规则多边形区域查询

  1. 定义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

  1. 创建一个带有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) 
  1. 插入一条数据以后
    可以利用
mapping = es_conn.es.indices.get_mapping(index=index_name)
print(mapping)

来检查location字段是不是geo_shape类型

  1. 定义查询
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列表,用来表示一个多边形顶点坐标,如果你的多边形没有挖孔,那么第一维只有一个元素,否则有多个。

你可能感兴趣的:(elasticsearch,大数据)