Elasticsearch java API操作 SPring Data框架搭建

JAVA API操作ES

  1. 配置类

    package jack.sun.config;
    
    import lombok.Data;
    import org.apache.http.HttpHost;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    //创建配置类
    @Data
    @Configuration
    @ConfigurationProperties(prefix = "elasticsearch")
    public class ElasticSearchConfig {
        private String host;
        private Integer port;
    
        @Bean
        public RestHighLevelClient client(){
            RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost(host,port,"http")));
            return restHighLevelClient;
        }
    }
    
    application.properties
    elasticsearch.host=192.168.6.10
    elasticsearch.port=9200
    
  2. 测试类

    package jack.sun.config;
    
    import com.alibaba.fastjson.JSONObject;
    import jack.sun.pojo.Student;
    import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
    import org.elasticsearch.action.bulk.BulkItemResponse;
    import org.elasticsearch.action.bulk.BulkRequest;
    import org.elasticsearch.action.bulk.BulkResponse;
    import org.elasticsearch.action.delete.DeleteRequest;
    import org.elasticsearch.action.delete.DeleteResponse;
    import org.elasticsearch.action.get.GetRequest;
    import org.elasticsearch.action.get.GetResponse;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.action.search.SearchRequest;
    import org.elasticsearch.action.search.SearchRequestBuilder;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.action.support.master.AcknowledgedResponse;
    import org.elasticsearch.action.update.UpdateRequest;
    import org.elasticsearch.action.update.UpdateResponse;
    import org.elasticsearch.client.RequestOptions;
    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.common.xcontent.XContentType;
    import org.elasticsearch.index.query.QueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.search.aggregations.AggregationBuilder;
    import org.elasticsearch.search.aggregations.AggregationBuilders;
    import org.elasticsearch.search.aggregations.Aggregations;
    import org.elasticsearch.search.aggregations.bucket.terms.Terms;
    import org.elasticsearch.search.aggregations.metrics.Avg;
    import org.elasticsearch.search.builder.SearchSourceBuilder;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.io.IOException;
    
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class ElasticSearchTest {
    
        @Autowired
        private RestHighLevelClient client;
    
        @Test
        public void Test01(){
            System.out.println("===============");
            System.out.println(client);
        }
    
        String MYINDEX = "my_index";
        //创建索引
        @Test
        public void createIndex() throws Exception{
            CreateIndexRequest request = new CreateIndexRequest(MYINDEX);
            request.mapping("{\n" +
                            "   \"properties\": {\n" +
                            "     \"name\": {\n" +
                            "       \"type\": \"keyword\",\n" +
                            "       \"index\": true,\n" +
                            "       \"store\": true\n" +
                            "     },\n" +
                            "     \"age\": {\n" +
                            "       \"type\": \"integer\",\n" +
                            "       \"index\": true,\n" +
                            "       \"store\": true\n" +
                            "     },\n" +
                            "     \"remark\": {\n" +
                            "       \"type\": \"text\",\n" +
                            "       \"index\": true,\n" +
                            "       \"store\": true,\n" +
                            "       \"analyzer\": \"ik_max_word\",\n" +
                            "       \"search_analyzer\": \"ik_smart\"\n" +
                            "     }\n" +
                            "   }\n" +
                            " }",
                          XContentType.JSON);
           CreateIndexResponse response = client.indices().create(request,RequestOptions.DEFAULT);
            System.out.println(response.isAcknowledged());
        }
        //查看索引
        @Test
        public void getIndex() throws Exception{
            //设置请求索引
            GetIndexRequest request = new GetIndexRequest(MYINDEX);
            //接收响应
            GetIndexResponse response = client.indices().get(request,RequestOptions.DEFAULT);
            System.out.println(response.getMappings());
            System.out.println(response.getSettings());
        }
        //删除索引
        @Test
        public void deleteIndex() throws Exception{
            DeleteIndexRequest request = new DeleteIndexRequest(MYINDEX);
            AcknowledgedResponse response = client.indices().delete(request,RequestOptions.DEFAULT);
            System.out.println(response.isAcknowledged());
        }
    
        //创建文档
        @Test
        public void createIndex_doc() throws  Exception{
            IndexRequest indexRequest = new IndexRequest("test");
            indexRequest.id("1");
            Student student = new Student(18,"zhangsan","ewew");
            indexRequest.source(JSONObject.toJSONString(student),XContentType.JSON);
            //创建响应流
            IndexResponse indexResponse = client.index(indexRequest,RequestOptions.DEFAULT);
            System.out.println("创建了文档");
            System.out.println(indexResponse.getIndex());
        }
        //修改文档
        @Test
        public void updateIndex() throws Exception{
            UpdateRequest request = new UpdateRequest("test","1");
            Student student = new Student();
            student.setRemark("我是张三");
            request.doc(JSONObject.toJSONString(student),XContentType.JSON);
            //创建响应流 
            UpdateResponse response = client.update(request,RequestOptions.DEFAULT);
            System.out.println(response.getResult());
        }
    
        //删除文档
        @Test
        public void deleteDocIndex() throws Exception{
            DeleteRequest request = new DeleteRequest("test","1");
            //创建响应对象
            DeleteResponse response = client.delete(request,RequestOptions.DEFAULT);
            System.out.println(response.getResult());
        }
        //根据Id进行查询
        @Test
        public void getById() throws Exception{
            GetRequest request = new GetRequest("test","1");
            GetResponse response = client.get(request,RequestOptions.DEFAULT);
            System.out.println(response.getSourceAsString());
        }
        //文档的批量操作
        @Test
        public void bulk() throws Exception{
            BulkRequest request = new BulkRequest();
            Student student = new Student();
            for(int i = 1; i<5 ;i++){
                student.setAge(i);
                student.setName("张三"+i);
                student.setRemark("hello"+i);
                request.add(new IndexRequest("ttl").id(String.valueOf(1 + i)).source(JSONObject.toJSONString(student),XContentType.JSON));
            }
            //迭代进行响应
            BulkResponse response = client.bulk(request,RequestOptions.DEFAULT);
            for (BulkItemResponse bulkItemResponse : response) {
                System.out.println(bulkItemResponse.isFailed());
            }
        }
        //查询文档
        String DC_NAME = "my_index";
        @Test
        public void DCQuery() throws IOException {
            SearchRequest request = new SearchRequest(DC_NAME);
            SearchSourceBuilder builder = new SearchSourceBuilder();
            builder.query(QueryBuilders.matchQuery("title","华为"));
            request.source(builder);
    
            SearchResponse response = client.search(request,RequestOptions.DEFAULT);
            for (SearchHit hit : response.getHits()) {
                System.out.println(hit.getSourceAsString());
            }
        }
        //文档的聚合查询
        @Test
        public void aggsSearch(){
            SearchRequest request = new SearchRequest(DC_NAME);
            SearchSourceBuilder builder = new SearchSourceBuilder();
            builder.query(QueryBuilders.matchAllQuery());
            AggregationBuilder aggregationBuilder = AggregationBuilders
                    .terms("groupby_category").field("category");
            aggregationBuilder.subAggregation(AggregationBuilders.avg("avg_price").field("price"));
            builder.aggregation(aggregationBuilder);
            request.source(builder);
            try {
                SearchResponse response = client.search(request, RequestOptions.DEFAULT);
                Aggregations aggregations = response.getAggregations();
                Terms terms = aggregations.get("groupby_category");
                terms.getBuckets().forEach(bucket -> {
                    Avg avg = bucket.getAggregations().get("avg_price");
                    System.out.println(bucket.getKeyAsString() + ":" + bucket.getDocCount() + "," + avg.getValue());
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    

Spirng Data框架

  1. 创建实体类

    package jack.sun.elasticsearch.pojo;
    
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    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;
    
    @Data
    @Document(indexName = "product",shards = 1,replicas = 1)
    @AllArgsConstructor
    @NoArgsConstructor
    public class Product {
    
        @Id
        private int id;
        @Field(type = FieldType.Text,analyzer = "ik_smart")
        private String productName;
        @Field(type = FieldType.Integer)
        private int store;
        @Field(type = FieldType.Double,index = true,store = false)
        private double price;
    }
    
    
    
  2. 创建配置类

    package jack.sun.elasticsearch.config;
    
    
    import lombok.Data;
    import org.apache.http.HttpHost;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestClientBuilder;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
    
    @ConfigurationProperties(prefix = "elasticsearch")
    @Configuration
    @Data
    public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
    
    
        private String host ;
    
        private Integer port ;
    
        //重写父类方法
        @Override
        public RestHighLevelClient elasticsearchClient() {
            RestClientBuilder builder = RestClient.builder(new HttpHost(host, port));
            RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);
            return restHighLevelClient;
        }
    
    
    }
    配置文件
    elasticsearch.host=192.168.6.10
    
    elasticsearch.port=9200
    
    logging.level.com.atguigu=debug
    
    
  3. 创建持久类

    package jack.sun.elasticsearch.dao;
    
    import jack.sun.elasticsearch.pojo.Product;
    import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    @Repository
    public interface ProductDao extends ElasticsearchRepository<Product,Long> {
        List<Product> findByPriceBetween(double low, double high);
    }
    
    
  4. 创建测试类

    package jack.sun.elasticsearch.test;
    
    import jack.sun.elasticsearch.dao.ProductDao;
    import jack.sun.elasticsearch.pojo.Product;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.domain.Sort;
    import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.List;
    
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class TestE {
    
        @Autowired
        private ElasticsearchRestTemplate elasticsearchRestTemplate;
    
        @Autowired
        private ProductDao productDao;
        @Test
        public void test01(){
            //加载springBoot,加载配置类
            //创建索引 根据product类中的@Document
            //elasticsearchRestTemplate.setIndex(product.class)
            //创建映射 根据Product类中的@Id @Field字段进行自动映射
            //elasticsearchRestTemplate.putMapping(Product.class)
    
        }
        //添加文档
        @Test
        public void add(){
            Product product = new Product(2,"vivo手机",1000,5588);
            productDao.save(product);
            System.out.println("添加成功");
        }
        //根据id进行查询
        @Test
        public void findById(){
            Product product = productDao.findById(1L).get();
            System.out.println("product = " + product);
        }
        //查询所有信息
        @Test
        public void findAll(){
            Iterable<Product> products = productDao.findAll(Sort.by(Sort.Direction.DESC, "price"));
            for (Product product : products) {
                System.out.println("product = " + product);
            }
        }
        //自定义方法
        @Test
        public void findBetweenPrice(){
            List<Product> list = this.productDao.findByPriceBetween(7000,9000);
            for (Product product : list) {
                System.out.println("product = " + product);
            }
        }
    }
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值