• springboot springdata 整合es


    实体类

    package com.fwz.tproject.bean;
    
    import java.io.Serializable;
    import java.math.BigDecimal;
    
    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 lombok.Data;
    import lombok.experimental.Accessors;
    
    @Data
    @Document(indexName = "product_index", shards = 3, replicas = 1)
    @Accessors(chain = true)
    public class Product implements Serializable {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        @Id
        Long id;
        @Field(type = FieldType.Text, analyzer = "ik_smart")
        String title; // 标题
        @Field(type = FieldType.Text, analyzer = "ik_max_word")
        String description; // 描述
        @Field(type = FieldType.Keyword)
        String category;// 分类
        @Field(type = FieldType.Keyword)
        String brand; // 品牌
        @Field(type = FieldType.Double)
        BigDecimal price; // 价格
        @Field(index = false, type = FieldType.Keyword)
        String images; // 图片地址
    }

    controller

    package com.fwz.tproject.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.elasticsearch.core.SearchHits;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.fwz.tproject.bean.Product;
    import com.fwz.tproject.serviceImpl.SpringESService;
    
    /**
     * r
     * 
     * @author 冯文哲
     * @version 2018-06-11
     */
    @RestController
    @RequestMapping(value = "/ses")
    public class SpringESController {
    
        @Autowired
        private SpringESService springESService;
    
        @RequestMapping(value = "/cindex")
        public Boolean testCreate() { //
            return springESService.createIndex();
        }
    
        @RequestMapping(value = "/search")
        public SearchHits<Product> search() { //
            return springESService.search();
        }
    
    }

    Service

    package com.fwz.tproject.serviceImpl;
    
    import java.math.BigDecimal;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.index.query.MultiMatchQueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.aggregations.AggregationBuilders;
    import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
    import org.elasticsearch.search.sort.SortBuilders;
    import org.elasticsearch.search.sort.SortOrder;
    import org.elasticsearch.search.suggest.SuggestBuilder;
    import org.junit.jupiter.api.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    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.ElasticsearchOperations;
    import org.springframework.data.elasticsearch.core.IndexOperations;
    import org.springframework.data.elasticsearch.core.SearchHits;
    import org.springframework.data.elasticsearch.core.SearchHitsIterator;
    import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
    import org.springframework.data.elasticsearch.core.document.Document;
    import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
    import org.springframework.data.elasticsearch.core.query.AliasQuery;
    import org.springframework.data.elasticsearch.core.query.BulkOptions;
    import org.springframework.data.elasticsearch.core.query.DeleteQuery;
    import org.springframework.data.elasticsearch.core.query.GetQuery;
    import org.springframework.data.elasticsearch.core.query.IndexQuery;
    import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
    import org.springframework.data.elasticsearch.core.query.MoreLikeThisQuery;
    import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
    import org.springframework.data.elasticsearch.core.query.Query;
    import org.springframework.data.elasticsearch.core.query.UpdateQuery;
    import org.springframework.data.elasticsearch.core.query.UpdateResponse;
    import org.springframework.data.util.CloseableIterator;
    
    import com.fwz.tproject.bean.Product;
    import com.fwz.tproject.service.ElasticSearchUtils;
    import com.fwz.tproject.service.IdGeneratorSnowflake;
    import com.fwz.tproject.service.Serv;
    
    @SpringBootTest
    class SpringESServiceTest implements Serv {
    
        Logger logger = LoggerFactory.getLogger(ElasticSearchUtils.class.getName());
        @Autowired
        public ElasticsearchOperations elasticsearchOperations;
        @Autowired
        public IdGeneratorSnowflake f;
    
        /**
         * 创建索引
         * 
         * @author fwzz
         * @version 创建时间:2021年1月29日 下午5:53:58
         *
         */
        @Test
        void testCreateIndex() {
            IndexOperations indexOperations = elasticsearchOperations.indexOps(Product.class);
            Document d = indexOperations.createMapping(Product.class);
            logger.info(d.toJson());
            logger.info("start=====================================");
    
            Boolean b = indexOperations.create();
            logger.info("end=====================================");
            indexOperations.putMapping(d);
            logger.info(b.toString());
    
        }
    
        /**
         * 设置别名
         * 
         * @author fwzz
         * @version 创建时间:2021年1月29日 下午5:54:05
         *
         */
        @Test
        void testSetAlias() {
    
            IndexOperations indexOperations = elasticsearchOperations.indexOps(Product.class);
            // 设置别名
            AliasQuery aq = new AliasQuery("my_product");
            indexOperations.addAlias(aq);
        }
    
        /**
         * 删除别名
         * 
         * @author fwzz
         * @version 创建时间:2021年1月29日 下午5:54:05
         *
         */
        @Test
        void testRemoveAlias() {
    
            IndexOperations indexOperations = elasticsearchOperations.indexOps(Product.class);
            // 删除别名
            AliasQuery aq = new AliasQuery("my_product");
            indexOperations.removeAlias(aq);
        }
    
        /**
         * 单条数据插入
         * 
         * @author fwzz
         * @version 创建时间:2021年1月29日 下午7:48:39
         *
         */
        @Test
        void testSaveDocuments() {
            Product product = new Product().setBrand(String.valueOf(32 / 5)).setCategory(String.valueOf(65 / 16))
                    .setDescription("红色的轿车").setPrice(new BigDecimal(568)).setTitle("比亚迪轿车")
                    .setImages("http://www.xymapp.cn").setId(f.snowflakeId());
            IndexQuery indexQuery = new IndexQueryBuilder().withId(product.getId().toString()).withObject(product).build();
            elasticsearchOperations.index(indexQuery, IndexCoordinates.of("my_product"));
        }
    
        /**
         * 单条数据插入
         * 
         * @author fwzz
         * @version 创建时间:2021年1月29日 下午7:48:39
         *
         */
        @Test
        void testSave() {
            Product product = new Product().setBrand(String.valueOf(32 / 5)).setCategory(String.valueOf(65 / 16))
                    .setDescription("红色的轿车").setPrice(new BigDecimal(568)).setTitle("比亚迪轿车")
                    .setImages("http://www.xymapp.cn").setId(f.snowflakeId());
            System.out.println(product.getId());
            elasticsearchOperations.save(product);
        }
    
        /**
         * 测试修改
         * 
         * @author fwzz
         * @version 创建时间:2021年1月29日 下午7:48:39
         *
         */
        @Test
        void testUpdate() {
            Product product = new Product().setId(1355127539135283200L).setBrand("update brand");
            elasticsearchOperations.save(product);
        }
    
        /**
         * 测试查询
         * 
         * @author fwzz
         * @version 创建时间:2021年1月29日 下午7:48:39
         *
         */
        @Test
        void testSearch() {
            // 分词字段/高亮字段
            String fieId = "title";
            String fieId1 = "description";
            NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
            // match类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系
            MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("比亚迪红色", fieId, fieId1);
            multiMatchQueryBuilder.type(MultiMatchQueryBuilder.Type.BEST_FIELDS);
            multiMatchQueryBuilder.tieBreaker(0.3F);
            // 应该匹配的分词的最少数量
            multiMatchQueryBuilder.minimumShouldMatch("30%");
            queryBuilder.withQuery(multiMatchQueryBuilder);
            // 排序
            queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
    
            HighlightBuilder.Field allHighLight = new HighlightBuilder.Field(fieId).preTags("<span style="color:red">")
                    .postTags("</span>").requireFieldMatch(false);
    
            HighlightBuilder.Field allHighLight1 = new HighlightBuilder.Field(fieId1).requireFieldMatch(false)
                    .preTags("<span style="color:red">").postTags("</span>");
    
            HighlightBuilder.Field[] ary = new HighlightBuilder.Field[2];
            ary[0] = allHighLight;
            ary[1] = allHighLight1;
            queryBuilder.withHighlightFields(ary);//高亮
            queryBuilder.addAggregation(AggregationBuilders.terms("4").field("category"));//聚合
            queryBuilder.withPageable(PageRequest.of(0, 10));//分页
    
            SearchHits<Product> hit = elasticsearchOperations.search(queryBuilder.build(), Product.class);
            logger.info(String.valueOf(hit.getSearchHits().size()));
    
        }
    
        /**
         * 批量插入
         * 
         * @author fwzz
         * @version 创建时间:2021年1月29日 下午7:48:39
         *
         */
        @Test
        void testPutBulkDocuments() {
            List<IndexQuery> queries = new ArrayList<IndexQuery>();
            for (int i = 0; i < 100; i++) {
                Product p = new Product();
                p.setBrand(String.valueOf(i / 5)).setCategory(String.valueOf(i / 16)).setDescription("红色的轿车")
                        .setPrice(new BigDecimal(568)).setTitle("比亚迪轿车").setImages("http://www.xymapp.cn")
                        .setId(f.snowflakeId());
                IndexQuery q = new IndexQueryBuilder().withId(p.getId().toString()).withObject(p).build();
    
                queries.add(q);
            }
    
            elasticsearchOperations.bulkIndex(queries, IndexCoordinates.of("my_product"));
            // elasticsearchOperations.bulkIndex(queries, index);
        }
    
    }

    ID工具类:

    package com.fwz.tproject.testfunction.service;
    
    import javax.annotation.PostConstruct;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    import cn.hutool.core.lang.Snowflake;
    import cn.hutool.core.net.NetUtil;
    import cn.hutool.core.util.IdUtil;
    
    @Component
    public class IdGeneratorSnowflake {
        private long workerId = 0;
        private long datacenterId = 1;
        private Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId);
    
        private static final Logger log = LoggerFactory.getLogger(IdGeneratorSnowflake.class.getName());
    
        // 依赖注入完成后执行该方法,进行一些初始化工作
        @PostConstruct
        public void init() {
            try {
                workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
                log.info("当前机器的workerId: {}", workerId);
            } catch (Exception e) {
                e.printStackTrace();
                log.warn("当前机器的workerId获取失败", e);
                // 释放ID
                workerId = NetUtil.getLocalhostStr().hashCode();
            }
        }
    
        // 使用默认机房号获取ID
        public synchronized long snowflakeId() {
            return snowflake.nextId();
        }
    
        // 自己制定机房号获取ID
        public synchronized long snowflakeId(long workerId, long datacenterId) {
            Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId);
    
            return snowflake.nextId();
        }
    
        /**
         * 生成的是不带-的字符审,类似于: 73a64edf935d4952a287739a66f96e06
         * 
         * @return
         */
        public String simpleUUID() {
            return IdUtil.simpleUUID();
        }
    
        /**
         * 生成的UUID是带-的字符串,类似于: b12b6401-6f9c-4351-b2b6-d8afc9ab9272
         * 
         * @return
         */
        public String randomUUID() {
            return IdUtil.randomUUID();
        }
    
        public static void main(String[] args) {
            IdGeneratorSnowflake f = new IdGeneratorSnowflake();
            for (int i = 0; i < 1000; i++) {
    
                System.out.println(f.snowflakeId(0, 0));
            }
    
        }
    }

    要使用工具类pom.xml需加入依赖:

     <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-captcha</artifactId>
                <version>5.2.0</version>
            </dependency>

    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    </dependency>

  • 相关阅读:
    数据结构与算法----双向链表
    数据结构与算法----数学应用之一元多项式
    数据结构----线性表顺序和链式结构的使用(c)
    Android--Otto事件总线 -- 组件之间通讯框架使用 --模式解析
    递归 —— 二分查找法 —— 归并排序
    自己做悬浮拖拽按钮依赖
    RePlugin 插件化-内置加载
    Android图片处理--缩放
    数据结构与算法---常用三大排序算法
    Android图片处理--全景查看效果
  • 原文地址:https://www.cnblogs.com/fengwenzhee/p/14347079.html
Copyright © 2020-2023  润新知