用client接口实现业务的增删改查
package m;
import com.alibaba.fastjson.JSONObject;
import m.dsf.controller.doing.Post;
import org.apache.http.HttpHost;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.elasticsearch.client.security.CreateApiKeyRequest;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
@SpringBootTest
//使用client
public class EsClient {
//工具,应该放到config里面初始化到bean,然后自动注入获取,这里省略步骤
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("110.40.223.200", 9200, "http"))
);
@Test
//创建索引,如果已经存在会报错
public void createIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest("test01");
//判断是否存在
boolean exists = esClient.indices().exists(request, RequestOptions.DEFAULT);
//不存在则创建
if (!exists){
CreateIndexRequest request1 = new CreateIndexRequest("test01");
CreateIndexResponse response = esClient.indices().create(request1,RequestOptions.DEFAULT);
System.out.printf("创建是否成功", response.isAcknowledged());
}else {
System.out.println("该索引已经存在");
}
}
@Test
//查询索引,没有会报错
public void findIndex() throws IOException {
GetIndexRequest request1 = new GetIndexRequest("test01");
GetIndexResponse getIndexResponse = esClient.indices().get(request1, RequestOptions.DEFAULT);
//打印详情
System.out.println(getIndexResponse.getAliases());
}
@Test
//全量查询
public void findALl() throws IOException {
//发送请求的索引库
SearchRequest request = new SearchRequest().indices("test01");
//查询条件 all全量查询,查询所有
SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()).from(2).size(10);
request.source(query);
SearchResponse search = esClient.search(request, RequestOptions.DEFAULT);
System.out.printf("时间", search.getTook());
//数据信息
org.elasticsearch.search.SearchHits hits = search.getHits();
hits.forEach(h-> System.out.println(h.getSourceAsString()));
esClient.close();
}
@Test
//批量添加
public void adds() throws IOException {
BulkRequest request = new BulkRequest();
Post post = new Post("rwgfrw", 30L,"2023-02-25");
Post post1 = new Post("egfqw", 30L,"2023-02-25");
Post post2= new Post("4ywgrbv", 30L,"2023-02-25");
request.add(new IndexRequest().index("test01").id("9").source(JSONObject.toJSON(post).toString(), XContentType.JSON));
request.add(new IndexRequest().index("test01").id("10").source(JSONObject.toJSON(post1).toString(),XContentType.JSON));
request.add(new IndexRequest().index("test01").id("11").source(JSONObject.toJSON(post2).toString(),XContentType.JSON));
BulkResponse bulk = esClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(bulk.getTook());
System.out.println(bulk.getItems());
esClient.close();
}
@Test
//批量删除
public void deleteDoc() throws IOException {
BulkRequest request = new BulkRequest();
//1. 封装Request对象
request.add(new DeleteRequest().index("test01").id("9"));
request.add(new DeleteRequest().index("test01").id("10"));
request.add(new DeleteRequest().index("test01").id("11"));
//2. client执行
BulkResponse bulk = esClient.bulk(request, RequestOptions.DEFAULT);
//3. 输出结果
System.out.println(bulk.getTook());
esClient.close();
}
@Test
//查询加条件加分页 注:如果想要精确查询不要用这个查询,因为有问题,不会将查询的条件分词,也不会具体查询,用match,尽量不要用term
//排序
//包含哪些字段不包含什么字段
public void find() throws IOException {
//发送请求的索引库
SearchRequest request = new SearchRequest().indices("test01");
//查询条件 all全量查询,查询所有
//from 起始页(查询的页数减一乘条数) size每页条数
SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.termQuery("name","我")).from(1).size(1);
//排序 ASC升序 DESC降序
query.sort("age", SortOrder.ASC);
//包含 只包含name
String[] includes = {"name"};
//不包含
String[] excludes = {};
//放入里面进行过滤
query.fetchSource(includes,excludes);
request.source(query);
SearchResponse search = esClient.search(request, RequestOptions.DEFAULT);
System.out.printf("时间", search.getTook());
//数据信息
org.elasticsearch.search.SearchHits hits = search.getHits();
hits.forEach(h-> System.out.println(h.getSourceAsString()));
esClient.close();
}
@Test
//组合查询
public void findlike() throws IOException {
//发送请求的索引库
SearchRequest request = new SearchRequest().indices("test01");
SearchSourceBuilder query = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//需要啥条件继续叠加 must等于数据库中 等于 但是es会进行分词后等于
//match分词匹配 term 是完全匹配
boolQueryBuilder.must(QueryBuilders.matchQuery("age",50));
boolQueryBuilder.must(QueryBuilders.matchQuery("name","我爱大"));
//should 代表or 可以进行
// boolQueryBuilder.should(QueryBuilders.matchQuery("name","小李"));
query.query(boolQueryBuilder);
request.source(query);
SearchResponse search = esClient.search(request, RequestOptions.DEFAULT);
System.out.printf("时间", search.getTook());
//数据信息
org.elasticsearch.search.SearchHits hits = search.getHits();
hits.forEach(h-> System.out.println(h.getSourceAsString()));
esClient.close();
}
@Test
//范围查询
public void scope() throws IOException {
//发送请求的索引库
SearchRequest request = new SearchRequest().indices("test01");
SearchSourceBuilder query = new SearchSourceBuilder();
//创建范围查询的builder
RangeQueryBuilder age = QueryBuilders.rangeQuery("age");
//大于等于10
age.gte(20);
//大于
//age.gt(20);
//小于等于50
age.lte(30);
//小于
//age.lt(30);
query.query(age);
request.source(query);
SearchResponse search = esClient.search(request, RequestOptions.DEFAULT);
System.out.printf("时间", search.getTook());
//数据信息
org.elasticsearch.search.SearchHits hits = search.getHits();
hits.forEach(h-> System.out.println(h.getSourceAsString()));
esClient.close();
}
@Test
//模糊查询
public void dimFind() throws IOException {
//发送请求的索引库
SearchRequest request = new SearchRequest().indices("test01");
SearchSourceBuilder query = new SearchSourceBuilder();
//创建模糊查询的builder 代表查询名称叫小李的,但是可以允许有一个字符差距 的也被搜索出来,类型小张 一个字不一样也可以
FuzzyQueryBuilder fuzziness = QueryBuilders.fuzzyQuery("name", "小李").fuzziness(Fuzziness.ONE);
query.query(fuzziness);
request.source(query);
SearchResponse search = esClient.search(request, RequestOptions.DEFAULT);
System.out.printf("时间", search.getTook());
//数据信息
org.elasticsearch.search.SearchHits hits = search.getHits();
hits.forEach(h-> System.out.println(h.getSourceAsString()));
esClient.close();
}
@Test
//高亮查询
public void Highlight() throws IOException {
//发送请求的索引库
SearchRequest request = new SearchRequest().indices("test01");
SearchSourceBuilder query = new SearchSourceBuilder();
//创建高亮查询的builder 代表查询名称叫小李的,但是可以允许有一个字符差距 的也被搜索出来,类型小张 一个字不一样也可以
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "小李");
//创建高亮的builder
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font color = 'red'>");
highlightBuilder.postTags("</font>");
highlightBuilder.field("name");
query.highlighter(highlightBuilder);
query.query(termQueryBuilder);
request.source(query);
SearchResponse search = esClient.search(request, RequestOptions.DEFAULT);
System.out.printf("时间", search.getTook());
//数据信息
org.elasticsearch.search.SearchHits hits = search.getHits();
System.out.println(hits.getTotalHits());
hits.forEach(h-> System.out.println(h.getSourceAsString()));
esClient.close();
}
@Test
//聚合查询
//注意查询是将所有的都查询出来,最大值是在search.getAggregations().aggregations。get(i)里面,可以自己去调试里面看
public void polymerize() throws IOException {
//发送请求的索引库
SearchRequest request = new SearchRequest().indices("test01");
SearchSourceBuilder query = new SearchSourceBuilder();
AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
// AggregationBuilder aggregationBuilder = AggregationBuilders.min("minAge").field("age"); 等等聚合函数
query.aggregation(aggregationBuilder);
request.source(query);
SearchResponse search = esClient.search(request, RequestOptions.DEFAULT);
System.out.printf("时间", search.getTook());
//数据信息
org.elasticsearch.search.SearchHits hits = search.getHits();
hits.forEach(h-> System.out.println(h.getSourceAsString()));
esClient.close();
}
@Test
//分组查询 search.getAggregations().aggregations.get(0) 在这个里面的buckets里面,通过调试可见 docCount 代表该组数量
public void groups() throws IOException {
//发送请求的索引库
SearchRequest request = new SearchRequest().indices("test01");
SearchSourceBuilder query = new SearchSourceBuilder();
//分组查询
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
query.aggregation(aggregationBuilder);
request.source(query);
SearchResponse search = esClient.search(request, RequestOptions.DEFAULT);
System.out.printf("时间", search.getTook());
//数据信息
org.elasticsearch.search.SearchHits hits = search.getHits();
hits.forEach(h-> System.out.println(h.getSourceAsString()));
esClient.close();
}
}
用template模版操作es
实体类
package m.dsf.controller.doing;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@Document(indexName = "test01",shards = 1,replicas = 0)
@Accessors(chain = true)
public class Post {
@Override
public String toString() {
return "Post{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", timeFrame=" + timeFrame +
'}';
}
public Post(String name, Long age, String timeFrame) {
this.name = name;
this.age = age;
this.timeFrame = timeFrame;
}
public Post() {
}
@Id
private Long id;
@Field(name = "name", type = FieldType.Text,analyzer = "ik_max_word", fielddata = true)
private String name;
@Field(name = "age", type = FieldType.Keyword)
private Long age;
@Field(name = "time_frame",type = FieldType.Date)
@JSONField(name="time_frame")
private String timeFrame;
@GeoPointField
private GeoPoint location;
public GeoPoint getLocation() {
return location;
}
public void setLocation(GeoPoint location) {
this.location = location;
}
public String getTimeFrame() {
return timeFrame;
}
public void setTimeFrame(String timeFrame) {
this.timeFrame = timeFrame;
}
public Long getAge() {
return age;
}
public void setAge(Long age) {
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
工具类
package m;
import m.dsf.controller.doing.Post;
import m.dsf.controller.doing.Post02;
import org.apache.http.HttpHost;
import org.assertj.core.util.Lists;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.GeoDistanceQueryBuilder;
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static org.elasticsearch.index.query.QueryBuilders.*;
@SpringBootTest
//使用ElasticsearchRestTemplate模版
public class EsTemplate {
@Autowired
private ElasticsearchRestTemplate template;
@Test
//删除索引
public void deleteUndex(){
boolean test02 = template.deleteIndex("test02");
System.out.println(test02);
}
@Test
//创建索引
//主要根据实体类里面的字段属性创建,类上一定要加document注解并加上值,字段加上Field并映射上是es数据库的哪个字段
public void createIndex(){
IndexOperations indexOperations = template.indexOps(Post02.class);
//判断这个索引库是否存在,不存在才可以创建
if (!indexOperations.exists()){
boolean b = indexOperations.create();
System.out.println("索引库创建成功");
//加载映射
Document mapping = indexOperations.createMapping(Post.class);
indexOperations.putMapping(mapping);
System.out.println("创建映射成功");
}else {
System.out.println("创建失败已经拥有此索引");
}
}
@Test
//查询所有
public void test(){
MatchAllQueryBuilder goodsName = QueryBuilders.matchAllQuery().queryName("name");
Query query = new NativeSearchQuery(goodsName).setPageable(PageRequest.of(1,10)) ;
SearchHits<Post> searchHits = template.search(query,
Post.class);
long totalHits = searchHits.getTotalHits();
List<SearchHit<Post>> hitList =
searchHits.getSearchHits();
hitList.forEach(l->{
System.out.println(l.getContent());
});
}
@Test
//批量添加 client方法
public void add() throws IOException {
RestHighLevelClient esClient = new RestHighLevelClient(
RestClient.builder(new HttpHost("110.40.223.200", 9200, "http"))
);
BulkRequest request = new BulkRequest();
request.add( new IndexRequest().index("test01").id("3").source(XContentType.JSON,"name","小李","age",50,"time_frame","2023-03-28"));
request.add( new IndexRequest().index("test01").id("4").source(XContentType.JSON,"name","小张","age",50,"time_frame","2023-03-28"));
request.add( new IndexRequest().index("test01").id("5").source(XContentType.JSON,"name","小鹏","age",50,"time_frame","2023-03-28"));
request.add( new IndexRequest().index("test01").id("6").source(XContentType.JSON,"name","大象","age",50,"time_frame","2023-03-28"));
request.add( new IndexRequest().index("test01").id("7").source(XContentType.JSON,"name","二位法官","age",50,"time_frame","2023-03-28"));
BulkResponse bulk = esClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(bulk.getTook());
System.out.println(bulk.getItems());
esClient.close();
}
/**
* 批量添加
*template 模版添加
* @author liuqiuyi
* @date 2021/4/29 19:53
*/
@Test
public void batchSaveTest() {
Post post = new Post("rwgfrw", 30L,"2023-02-25");
post.setId(14l);
Post post1 = new Post("egfqw", 30L,"2023-02-25");
post1.setId(15l);
Post post2= new Post("4ywgrbv", 30L,"2023-02-25");
post2.setId(16l);
ArrayList<Post> list = Lists.newArrayList(post,post1,post2);
List<IndexQuery> indexQueryList = Lists.newArrayList();
for (Post p : list) {
IndexQuery indexQuery = new IndexQueryBuilder()
.withObject(p)
.build();
indexQueryList.add(indexQuery);
}
template.bulkIndex(indexQueryList,BulkOptions.defaultOptions(),IndexCoordinates.of("test01"));
}
@Test
// 使用template模版分页条件查询
//查询加条件加分页
//排序
//包含哪些字段不包含什么字段
public void find2() throws IOException {
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(matchQuery("name", "我爱大合肥"))
.withSort(SortBuilders.fieldSort("age").order(SortOrder.ASC))
//分页的信息,每页10条
.withPageable(PageRequest.of(0,10))
.build();
SearchHits<Post> searchHits = template.search(query, Post.class);
System.out.println("总条数"+searchHits.getTotalHits());
for (SearchHit<Post> hit : searchHits) {
System.out.println("hit = " + hit.getContent());
}
}
@Test
//高亮查询
public void testHightQuery(){
//创建一个match查询的条件对象
NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(matchQuery("name", "我爱大"))
.withHighlightFields(new HighlightBuilder.Field("name").preTags("<font color='red'>").postTags("</font>")).build();
//传入构建好的nativeQuery对象,实体对象,通过模板对象查询es
SearchHits<Post> result = template.search(build, Post.class);
result.forEach(r->{
//打印商品信息
System.out.println(r.getHighlightFields().get("name"));//获取高亮效果的查询结果
System.out.println(r.getScore());
});
}
//bool符合查询
@Test
public void testBoolQuery(){
NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(boolQuery().must(
//并且
boolQuery().
should(matchQuery("name", "我爱大"))
.should(matchQuery("name", "小李"))
//或者
).mustNot(termQuery("age", 30))
//并且
.must(rangeQuery("age").gte("10").lte("30"))
).build();
SearchHits<Post> search = template.search(build, Post.class);
search.forEach(s->{
System.out.println("满足的记录"+s.getContent());
});
}
//地图经纬查询
@Test
public void testNearBy(){
//维度31.840993,
//经度 117.292748
GeoDistanceQueryBuilder location = QueryBuilders.geoDistanceQuery("location").
//半径圆2km以内
point(31.840993, 117.292748).distance(2.0, DistanceUnit.KILOMETERS);
NativeSearchQuery build = new NativeSearchQueryBuilder().withQuery(location).build();
SearchHits<Post> search = template.search(build, Post.class);
search.forEach(s->{
System.out.println(s.getContent());
});
}
}
用继承ElasticsearchRepository类实现一些增删改查
实体类
package m.dsf.controller.doing;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@Document(indexName = "test01",shards = 1,replicas = 0)
@Accessors(chain = true)
public class Post {
@Override
public String toString() {
return "Post{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", timeFrame=" + timeFrame +
'}';
}
public Post(String name, Long age, String timeFrame) {
this.name = name;
this.age = age;
this.timeFrame = timeFrame;
}
public Post() {
}
@Id
private Long id;
@Field(name = "name", type = FieldType.Text,analyzer = "ik_max_word", fielddata = true)
private String name;
@Field(name = "age", type = FieldType.Keyword)
private Long age;
@Field(name = "time_frame",type = FieldType.Date)
@JSONField(name="time_frame")
private String timeFrame;
@GeoPointField
private GeoPoint location;
public GeoPoint getLocation() {
return location;
}
public void setLocation(GeoPoint location) {
this.location = location;
}
public String getTimeFrame() {
return timeFrame;
}
public void setTimeFrame(String timeFrame) {
this.timeFrame = timeFrame;
}
public Long getAge() {
return age;
}
public void setAge(Long age) {
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
工具类(只写部分剩下可以自己摸索)
package m;
import m.dsf.controller.config.mapper.PostRepository;
import m.dsf.controller.doing.Post;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import java.util.Optional;
@SpringBootTest
//使用继承
public class ESpostRepository {
@Autowired
PostRepository postRepository;
@Test
//根据id查询
public void findById(){
Optional<Post> byId = postRepository.findById(1l);
System.out.println(byId);
}
@Test
//条件加分页查询
public void termQuery(){
PageRequest pageRequest = PageRequest.of(0,4);
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("age","30");
Page<Post> search = postRepository.search(termQueryBuilder, pageRequest);
System.out.println(search.getContent());
}
}
实现经纬度画园查询
实体类
package m.dsf.controller.doing;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.GeoPointField;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
@Document(indexName = "test02",shards = 1,replicas = 0)
@Accessors(chain = true)
public class Post02 {
@Override
public String toString() {
return "Post02{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", timeFrame='" + timeFrame + '\'' +
", location=" + location +
'}';
}
public Post02(String name, Long age, String timeFrame) {
this.name = name;
this.age = age;
this.timeFrame = timeFrame;
}
public Post02() {
}
@Id
private Long id;
@Field(name = "name", type = FieldType.Text,analyzer = "ik_max_word", fielddata = true)
private String name;
@Field(name = "age", type = FieldType.Integer)
private Long age;
@Field(name = "time_frame",type = FieldType.Keyword)
@JSONField(name="time_frame")
private String timeFrame;
@GeoPointField
private GeoPoint location;
public GeoPoint getLocation() {
return location;
}
public void setLocation(GeoPoint location) {
this.location = location;
}
public String getTimeFrame() {
return timeFrame;
}
public void setTimeFrame(String timeFrame) {
this.timeFrame = timeFrame;
}
public Long getAge() {
return age;
}
public void setAge(Long age) {
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Post02(Long id, String name, Long age, String timeFrame, GeoPoint location) {
this.id = id;
this.name = name;
this.age = age;
this.timeFrame = timeFrame;
this.location = location;
}
}
工具类
package m;
import m.dsf.controller.config.mapper.Post2Mapper;
import m.dsf.controller.doing.Post02;
import org.assertj.core.util.Lists;
import org.elasticsearch.common.unit.DistanceUnit;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.geo.GeoPoint;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import java.util.List;
@SpringBootTest
public class ESPost02Repository {
@Autowired
private Post2Mapper post2Mapper;
@Autowired
private ElasticsearchRestTemplate template;
@Test
//批量添加
public void adds(){
Post02 p1 = new Post02(1l,"小李",10l,"2023-01-05", new GeoPoint(31.73621,117.32104));
Post02 p2 = new Post02(2l,"小丽",20l,"2023-01-05", new GeoPoint(31.73609,117.32366 ));
Post02 p3 = new Post02(3l,"小万",18l,"2023-01-05", new GeoPoint(31.73420,117.32024 ));
Post02 p4 = new Post02(4l,"小张",25l,"2023-01-05", new GeoPoint(31.73334,117.31623 ));
Post02 p5 = new Post02(5l,"小江",22l,"2023-01-05", new GeoPoint(31.72783,117.30978 ));
List<Post02> list = Lists.newArrayList(p1,p2,p3,p4,p5);
//真实业务批量添加时直接从数据库查到数据扔进去
post2Mapper.saveAll(list);
}
@Test
//条件查询
public void findAll(){
//排序条件
FieldSortBuilder age = SortBuilders.fieldSort("age").order(SortOrder.DESC);
//判断条件
BoolQueryBuilder bqb = QueryBuilders.boolQuery();
// bqb.must(QueryBuilders.matchQuery("name","小李"));
//bqb.must(QueryBuilders.matchQuery("age",10));
//查询在当前 经纬度一千米为半径画园时,在es数据库中的数据,后面的 DistanceUnit.KILOMETERS代表距离单位,km,意思是距离一千米,半径画圆查找,不是直线
bqb.must(QueryBuilders.geoDistanceQuery("location").point( 31.72823,117.30426 ).distance(1, DistanceUnit.KILOMETERS));
//分页
Pageable pageable = PageRequest.of(0, 5);
NativeSearchQuery build = new NativeSearchQueryBuilder()
.withQuery(bqb)
.withSort(age)
.withPageable(pageable)
.build();
SearchHits<Post02> searchHits = template.search(build, Post02.class);
List<SearchHit<Post02>> searchHits1 = searchHits.getSearchHits();
searchHits1.forEach(a-> System.out.println(a));
}
}