文档章节

Elasticsearch地理位置维护及检索案例分享

bboss
 bboss
发布于 2018/03/31 21:32
字数 636
阅读 646
收藏 15

Elasticsearch地理位置信息维护及检索/排序案例分享

1.准备工作

参考文档《高性能elasticsearch ORM开发库使用介绍》导入和配置es客户端到工程

2.定义和创建带地理位置类型的mapping

创建一个city索引表结构,字段location的 类型为geo_point,并且定义一个检索的dsl语句

在resources目录下创建文件esmapper/address.xml,内容如下:

<properties>
<property name="createCityIndice"><![CDATA[{
  "settings": {
         "number_of_shards": 6,
         "index.refresh_interval": "5s"
  },
  "mappings": {
                "city": {
                    "properties": {
                        "standardAddrId":{
                            "type":"keyword"
                        },
                        "detailName": {
                            "type": "text",
                             
                            "fields": {
                                "keyword": {
                                    "type": "keyword"
                                }
                            }
                        },
                        "cityName":{
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword"
                                }
                            }
                        },
                        "countyName":{
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword"
                                }
                            }
                        },
                        "location":{
                            "type": "geo_point"
                        }

                    }
                }
            }
}]]></property>
<property name="locationSearch"><![CDATA[{
        "size": 100,
        "sort": [
            {
                "_geo_distance": { ##按离指定地理坐标对应的地理位置远近距离升序排序
                    "unit": "km",
                    "order": "asc",
                    "location": { ##指定参考地理坐标位置
                        "lon": #[lon],
                        "lat": #[lat]
                    }
                }
            },
            {
                "totalSaleNum": {
                    "order": "desc"
                }
            }
        ],
        "query": {
            "bool": {
                "must": [
                    {
                          "match_phrase_prefix" : {
                                "detailName" : {
                                    "query" : #[detailName]
                                }
                            }

                    },
                    {
                        "geo_distance": {
                            "distance": #[distance],
                            "location": {
                                "lon": #[lon],
                                "lat": #[lat]
                            }
                        }
                    }
                ]
            }
        }
    }]]></property>
</properties>

创建索引表

//创建加载配置文件的客户端工具,单实例多线程安全,第一次运行要预加载,有点慢
		ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/address.xml");
		try {
			//先删除名称为city的mapping
			clientUtil.dropIndice("city");
		} catch (ElasticSearchException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//再创建mapping
		clientUtil.createIndiceMapping("city",//索引表名称
				"createCityIndice");//索引表mapping dsl脚本名称,在esmapper/address.xml中定义createCityIndice
        String mapping = clientUtil.getIndice("city");//获取刚才创建的索引结构
        System.out.println(mapping);

3.添加索引文档

Map<String,String> params = new HashMap<String,String>();
		params.put("cityName","潭市");
		params.put("standardAddrId","38130122");
		params.put("detailName","XX市花园办事处YY路四冶生活区4-11栋33单元1层1010");
		params.put("location","28.292781,117.238963");
		params.put("countyName","中国");
ClientInterface clientUtil = ElasticSearchHelper.getRestClientUtil();				
clientUtil.addDocument("city",//索引名称
                       "city",//索引类型
                        params);//索引数据对象
                        "refresh");//强制刷新索引数据,让插入数据实时生效,如果考虑性能需要,可以去掉refresh参数

4.地理位置检索 

ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/address.xml");
		Map<String,String> params = new HashMap<String,String>();
		params.put("detailName","海域香廷EE栋1单元3层302室");
		params.put("distance","0.5km");
		params.put("lon","115.824994");
		params.put("lat","28.666162");
//返回map对象列表,也可以返回其他实体对象列表
		ESDatas<Map> datas = clientUtil.searchList("city/_search","locationSearch",params,Map.class);
//返回json报文
		System.out.print(clientUtil.executeRequest("city/_search","locationSearch",params));

5.参考文档

更多bboss 使用文档可以参考:

https://my.oschina.net/bboss/blog/1556866

© 著作权归作者所有

共有 人打赏支持
bboss

bboss

粉丝 110
博文 60
码字总数 68205
作品 8
长沙
程序员
私信 提问
基于 elasticsearch 的网站数据全文检索

【业务需求】 一、功能需求 网站需要向用户提供基于elasticsearch的全文检索功能支持,包括: 1、通过关键字词检索符合用户期望的数据,结合数据匹配度向用户数据 list; 2、良好实现中文、英...

network2019
2017/08/10
0
0
Elasticsearch最佳实践之使用场景

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zwgdft/article/details/82917861 序   最开始使用Elasticsearch是两年多前,在一家创业公司负责数据系统的...

Mr-Bruce
2018/10/08
0
0
Elastic 中国开发者大会 [上市特惠门票5折抢]

2018年11月10日周六,Elastic 中国开发者大会将在深圳金茂 JW 万豪酒店召开。届时,将有来自 Elastic、eBay、暴雪、Grab、华为、阿里巴巴、顺丰等公司的25位各领域的专家为大家带来围绕 Elas...

Medcl
2018/07/30
9
0
Elastic 中国开发者大会 [上市特惠门票5折抢]

2018年11月10日周六,Elastic 中国开发者大会将在深圳金茂 JW 万豪酒店召开。届时,将有来自 Elastic、eBay、暴雪、Grab、华为、阿里巴巴、顺丰等公司的25位各领域的专家为大家带来围绕 Elas...

Medcl
2018/07/30
0
0
Elasticsearch 快速开始

Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎。 查询 : Elasticsearch 允许执行和合并多种类型的搜索 — 结构化、非结构化、地理位置、度量指标 — 搜索方式随心而变。 ...

不要乱摸
2018/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Scala实战:迁移文件

Scala作为script使用也是非常的方便。 原文地址:https://www.yangbajing.me/2019/03/22/scala实战:迁移文件/ 前因 最近因为线上文件越来越多,导致磁盘不够用。需要将磁盘上数据迁移到一块...

羊八井
23分钟前
0
0
vagrant

安装virtualbox、vagrant,重启电脑 创建目录vagrant_ubuntu1804,进入目录后 vagrant box add http://mirrors.ustc.edu.cn/ubuntu-cloud-images/bionic/20190312.1/bionic-server-cloudimg-......

chuqq
34分钟前
0
0
Java 多线程测试 笔记(一)

测试 没有Synchronized的并发 结果 用比较实际的方式测试,比如说卖东西,赚钱 public class Sell implements Runnable { static Sell sell = new Sell(); //商品总数 sta...

_大侠__
34分钟前
0
0
《大话数据结构》读后总结(四)

一、算法 1、算法效率的度量方法 1.1 事后统计方法 通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。该方法具有很大缺陷,不...

徐曙辉
59分钟前
3
0
Android 整体设计及背后意义

阿里妹导读:现实工作中经常可以听到这样的说法:框架的升级带来协议性能的提升、编程模式的变革带来业务的飞跃...... 姑且不论这些表述是否有问题,实际上如果系统地看待事物整体,可能会有...

阿里云云栖社区
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部