elasticsearch5.6.16与springboot的整合使用(主要是9300端口)
当前使用的elasticsearch版本是5.6.16版本springboot的版本主要是2.0.9.RELEASE稳定版,详细的maven依赖参考如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--elasticsearch-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.16</version>
</dependency>
<dependency>
<groupId>org.locationtech.spatial4j</groupId>
<artifactId>spatial4j</artifactId>
<version>0.6</version>
</dependency>
<dependency>
<groupId>com.vividsolutions</groupId>
<artifactId>jts</artifactId>
<version>1.13</version>
<exclusions>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--devtools热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
</dependencies>
写一个elasticsearch的配置类
@Configuration
public class ElasticSearchConfig {
private static final Logger logger = LoggerFactory.getLogger(ElasticSearchConfig.class);
@Value("${elasticsearch.ip}")
private String hostName;
@Value("${elasticsearch.port}")
private String port;
@Value("${elasticsearch.cluster.name}")
private String clusterName;
@Value("${elasticsearch.pool}")
private String poolSize;
@Bean
public TransportClient transportClient() {
logger.info("Elasticsearch begin to init ");
TransportClient transportClient = null;
try {
// 地址信息
InetSocketTransportAddress transportAddress = new InetSocketTransportAddress(
InetAddress.getByName(hostName), Integer.valueOf(port));
// 配置信息
Settings esSetting = Settings.builder().put("cluster.name", clusterName) // 集群名字
.put("client.transport.sniff", true)// 增加嗅探机制,找到ES集群
.put("thread_pool.search.size", Integer.parseInt(poolSize))// 线程池个数
.put("client.transport.ping_timeout","120s")// 超时时间
.build();
// 配置信息Settings自定义
transportClient = new PreBuiltTransportClient(esSetting);
transportClient.addTransportAddresses(transportAddress);
} catch (Exception e) {
logger.error("TransportClient create error", e);
}
return transportClient;
}
}
连接elasticsearch的yml配置
# Elasticsearch
#9200端口是RESTFul API来访问ElasticSearch的端口,9300端口是es节点通讯的默认端口,给java程序用的配置9300
elasticsearch:
ip: 127.0.0.1
port: 9300
pool: 5
cluster:
name: elasticsearch(在本机安转后访问localhost:9200端口查看cluster的名字)
简单一点的elasticsearch的操作(新增索引,索引一条数据,DSLQUery,聚合的简单操作)
@RestController
public class EsController {
@Autowired
private TransportClient transportClient;
/**
* 测试elasticsearch Get的查询
* @param id
* @return
*/
@GetMapping("/customer/person/{id}")
public Map<String, Object> getIndexById(@PathVariable("id") String id){
// System.out.println("transportClient = " + transportClient);
GetResponse response = transportClient.prepareGet("customer", "person", id).get();
Map<String, Object> source = response.getSource();
return source;
}
@GetMapping("/customer/person/add")
public String add() throws IOException {
User user=new User("zpj",18,"男","hunandaxue");
XContentBuilder xContentBuilder= XContentFactory.jsonBuilder()
.startObject()
.field("name",user.getName())
.field("age",user.getAge())
.field("sex",user.getSex())
.field("school",user.getSchool())
.endObject();
IndexResponse indexResponse = transportClient.prepareIndex("customer", "person").setSource(xContentBuilder).get();
return "success";
}
@GetMapping("/customer/person")
public String del(@RequestParam("id") String id){
transportClient.prepareDelete("customer","person",id).get();
return "success";
}
@GetMapping("/customer/person/update")
public String update(@RequestParam("id2") String id2) throws ExecutionException, InterruptedException, IOException {
System.out.println("id2 = " + id2);
UpdateRequest updateRequest=new UpdateRequest("customer","person",id2);
XContentBuilder xContentBuilder=XContentFactory.jsonBuilder()
.startObject()
.field("name","zpjyyyy")
.endObject();
updateRequest.doc(xContentBuilder);
transportClient.update(updateRequest).get();
return "success";
}
@GetMapping("/blank/search")
public List<Object> query() throws ExecutionException, InterruptedException {
// 构建query语句
QueryBuilder queryBuilder=new MatchQueryBuilder("address","mill");
// 构建agg聚合语句
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age");
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
ageAgg.subAggregation(balanceAvg);
// 通过transportClient执行上述构建的语句
SearchResponse searchResponse = transportClient.prepareSearch()
.setQuery(queryBuilder)
.addAggregation(ageAgg)
// .addAggregation(balanceAvg)
.execute().actionGet();
List<Object> list=new ArrayList();
// 获取到查询出来的数据Hitis为query语句查询出来的数据
Iterator<SearchHit> iterator = searchResponse.getHits().iterator();
// 使用迭代器进行遍历
while (iterator.hasNext()){
// 拿出每一个数据
SearchHit next = iterator.next();
// 存到准备好的list集合中
list.add(next.getSource());
}
// 获取到agg语句查询出来的部分
Terms ageAggTerms = (Terms) searchResponse.getAggregations().asMap().get("ageAgg");
Iterator<? extends Terms.Bucket> iteratorAge = ageAggTerms.getBuckets().iterator();
while (iteratorAge.hasNext()){
Terms.Bucket next = iteratorAge.next();
InternalAvg internalAvg = (InternalAvg) next.getAggregations().asMap().get("balanceAvg");
list.add(internalAvg.getName()+" : "+internalAvg.getValue());
}
return list;
}
}
使用elasticsearch进行地理查询的复杂操作(DLSQuery,聚合,地理查询函数的使用)
主要使用的geo_point类型的数据
@RestController
public class CityController {
@Autowired
private TransportClient transportClient;
@GetMapping("/useGeoDistance")
public List<Object> UseGeoDistance(){
GeoPoint geoPoint=new GeoPoint();
geoPoint.reset(24.46667, 118.10000);
// 构造一个distance距离聚合查询在离厦门300km-800km的城市个数
GeoDistanceAggregationBuilder geoAgg=AggregationBuilders.geoDistance("distanceAgg", geoPoint)
.field("location")
.unit(DistanceUnit.KILOMETERS)
.addRange(300.00,800.00);
GeoDistanceSortBuilder sort = SortBuilders.geoDistanceSort("location", 24.46667, 118.10000)
.order(SortOrder.DESC);// 按照距离location点距离进行倒序排序
QueryBuilder qbFilter = geoDistanceQuery("location") // 点的名字
.point(24.46667, 118.10000)// 点的位置
.distance(800, DistanceUnit.KILOMETERS);// 距离当前点的距离
QueryBuilder boolQuery=new BoolQueryBuilder()
.must(new MatchAllQueryBuilder())// 添加必须满足匹配全部被
.filter(qbFilter);// 添加filter部分语句
SearchResponse searchResponse = transportClient.prepareSearch()
.setQuery(boolQuery)
.addSort(sort)
.addAggregation(geoAgg)
.get();// 发送search请求并获取返回的数据
List<Object> list=new ArrayList<>();
Iterator<SearchHit> iterator = searchResponse.getHits().iterator();
while (iterator.hasNext()){
SearchHit next = iterator.next();
Map<String, Object> source = next.getSource();
list.add(source);
}
Aggregation distanceAgg = searchResponse.getAggregations().get("distanceAgg");
// Map<String, Object> metaData = distanceAgg.getMetaData();
list.add(distanceAgg);
return list;
}
}
后续是geo_shape的操作