elasticsearch GIS空间查询问题解决

来源:互联网 发布:linux 限制访问目录 编辑:程序博客网 时间:2024/04/20 08:04

我定义了两个方法,一起来看一下:
?
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
  
*/
  
    protectedstatic FilterBuilder geoDistanceFilter(Double x,Double y,Double distance) {
  
   returnFilterBuilders.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
  
*/
  
    protectedstatic FilterBuilder geoBoundingBoxFilter(Double topleft_x,Double topleft_y,Double bottomRight_x,Double bottomRight_y) {
  
   returnFilterBuilders.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
   publicList<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(newString[]{indexName}).setTypes(newString[]{docType}).setQuery(queryBuilder);
 
  if(sort !=null) {
 
 SortBuilder[] sr = sort;
 
 intshs = sort.length;
 
 
 
 for(intarr$ = 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;
 
  intvar20 = var18.length;
 
 
 
  for(inti$ = 0; i$ < var20; ++i$) {
 
 SearchHit sh = var19[i$];
 
 Map map = sh.getSource();
 
 map.put("_index_id", sh.getId());
 
 list.add(map);
 
  }
 
 
 
  returnlist;
 
   }

 

各位一定要注意,所查询字段必须是geo_point类型,否则是无法进行空间查询的,本人开始也犯了这个错误。
 
如图:我查询的是the_geom 字段,我们可以看到是geo_point 。elasticsearch对GIS数据的支持还是蛮强大的。

0 0