elasticsearch GIS空间查询问题解决
来源:互联网 发布:linux 限制访问目录 编辑:程序博客网 时间:2024/04/20 08:04
我定义了两个方法,一起来看一下:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
/**
* geodistance filter
* 一个过滤器来过滤基于一个特定的距离从一个特定的地理位置/点。
* @author chenjie
* @param x
* @param y
* @param distance
* @return
*/
protected
static
FilterBuilder geoDistanceFilter(Double x,Double y,Double distance) {
return
FilterBuilders.geoDistanceFilter(
"the_geom"
)
.point(x, y)
.distance(distance, DistanceUnit.METERS)
.optimizeBbox(
"memory"
)
// Can be also "indexed" or "none"
.geoDistance(GeoDistance.ARC);
// Or GeoDistance.PLANE
}
/**
* geo bounding box filter
* 定义一个过滤器来过滤基于边界框左上角和右下角的位置/分
* @author chenjie
* @return FilterBuilder
*/
protected
static
FilterBuilder geoBoundingBoxFilter(Double topleft_x,Double topleft_y,Double bottomRight_x,Double bottomRight_y) {
return
FilterBuilders.geoBoundingBoxFilter(
"the_geom"
)
.topLeft(topleft_x, topleft_y)
.bottomRight(bottomRight_x, bottomRight_y);
}
我们可以看的到这两个方法分是做距离查询(可以用于周边查询,注意方法中DistanceUnit.METERS指的是计算单位)和距形查询 我们再看看elasticsearch是如何查询数据的,我封装了一个方法 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
public
List<Map<String, Object>> searchByQuery(String indexName, String docType, QueryBuilder queryBuilder, FilterBuilder filterBuilder,
int
from,
int
size, SortBuilder... sort)
throws
Exception {
ArrayList list =
new
ArrayList();
SearchRequestBuilder request =
this
.elasticSearchClient.prepareSearch(
new
String[]{indexName}).setTypes(
new
String[]{docType}).setQuery(queryBuilder);
if
(sort !=
null
) {
SortBuilder[] sr = sort;
int
shs = sort.length;
for
(
int
arr$ =
0
; arr$ < shs; ++arr$) {
SortBuilder len$ = sr[arr$];
request.addSort(len$);
}
}
SearchResponse var17 = (SearchResponse)request.setPostFilter(filterBuilder).setFrom(from).setSize(size).execute().actionGet();
SearchHit[] var18 = var17.getHits().hits();
SearchHit[] var19 = var18;
int
var20 = var18.length;
for
(
int
i$ =
0
; i$ < var20; ++i$) {
SearchHit sh = var19[i$];
Map map = sh.getSource();
map.put(
"_index_id"
, sh.getId());
list.add(map);
}
return
list;
}
各位一定要注意,所查询字段必须是geo_point类型,否则是无法进行空间查询的,本人开始也犯了这个错误。 如图:我查询的是the_geom 字段,我们可以看到是geo_point 。elasticsearch对GIS数据的支持还是蛮强大的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* geodistance filter
* 一个过滤器来过滤基于一个特定的距离从一个特定的地理位置/点。
* @author chenjie
* @param x
* @param y
* @param distance
* @return
*/
protected
static
FilterBuilder geoDistanceFilter(Double x,Double y,Double distance) {
return
FilterBuilders.geoDistanceFilter(
"the_geom"
)
.point(x, y)
.distance(distance, DistanceUnit.METERS)
.optimizeBbox(
"memory"
)
// Can be also "indexed" or "none"
.geoDistance(GeoDistance.ARC);
// Or GeoDistance.PLANE
}
/**
* geo bounding box filter
* 定义一个过滤器来过滤基于边界框左上角和右下角的位置/分
* @author chenjie
* @return FilterBuilder
*/
protected
static
FilterBuilder geoBoundingBoxFilter(Double topleft_x,Double topleft_y,Double bottomRight_x,Double bottomRight_y) {
return
FilterBuilders.geoBoundingBoxFilter(
"the_geom"
)
.topLeft(topleft_x, topleft_y)
.bottomRight(bottomRight_x, bottomRight_y);
}
我们可以看的到这两个方法分是做距离查询(可以用于周边查询,注意方法中DistanceUnit.METERS指的是计算单位)和距形查询
我们再看看elasticsearch是如何查询数据的,我封装了一个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public
List<Map<String, Object>> searchByQuery(String indexName, String docType, QueryBuilder queryBuilder, FilterBuilder filterBuilder,
int
from,
int
size, SortBuilder... sort)
throws
Exception {
ArrayList list =
new
ArrayList();
SearchRequestBuilder request =
this
.elasticSearchClient.prepareSearch(
new
String[]{indexName}).setTypes(
new
String[]{docType}).setQuery(queryBuilder);
if
(sort !=
null
) {
SortBuilder[] sr = sort;
int
shs = sort.length;
for
(
int
arr$ =
0
; arr$ < shs; ++arr$) {
SortBuilder len$ = sr[arr$];
request.addSort(len$);
}
}
SearchResponse var17 = (SearchResponse)request.setPostFilter(filterBuilder).setFrom(from).setSize(size).execute().actionGet();
SearchHit[] var18 = var17.getHits().hits();
SearchHit[] var19 = var18;
int
var20 = var18.length;
for
(
int
i$ =
0
; i$ < var20; ++i$) {
SearchHit sh = var19[i$];
Map map = sh.getSource();
map.put(
"_index_id"
, sh.getId());
list.add(map);
}
return
list;
}
各位一定要注意,所查询字段必须是geo_point类型,否则是无法进行空间查询的,本人开始也犯了这个错误。
如图:我查询的是the_geom 字段,我们可以看到是geo_point 。elasticsearch对GIS数据的支持还是蛮强大的。
0 0
- elasticsearch GIS空间查询问题解决
- elasticSearch空间坐标的设置和查询
- ArcView GIS 应用与开发技术(7)- 空间查询
- ElasticSearch for GIS应用
- 【ElasticSearch】 QueryString查询中文歧义词异常问题解决
- GIS空间索引技术
- GIS空间索引
- GIS空间索引
- GIS空间索引
- GIS中的空间参考
- GIS空间索引
- elasticsearch-查询
- Elasticsearch查询
- Elasticsearch查询
- ElasticSearch查询
- Elasticsearch 查询
- Elasticsearch NoNodeAvailableException 问题解决
- GIS空间分析算法 内容简介
- id为动态,定位DOM元素
- 安装kali linux并进行远程连接
- FragmentStatePagerAdapter 与 FragmentPagerAdapter 的区别
- 针对《面试心得与总结—BAT、网易、蘑菇街》一文中出现的技术问题的收集与整理(2)
- bundle install失败
- elasticsearch GIS空间查询问题解决
- ES报错dangling index, exists on local file system, but not in cluster metadata, auto import to cluster
- demofacial.py
- LinkedList实现堆栈、队列
- 彩色车牌分割
- CardView个人总结
- excel导出时列超过26时解决办法
- Activitylifecyclecallbacks使用
- ASP.NET MVC 启动定时任务删除某一文件夹下面的全部文件