jaav对es的初级入门操作

用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));
    }


}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值