搜索引擎elasticsearch实现

1.依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

2.配置文件

elasticsearch:
        rest:
            uris: http://localhost:9200

3.新建es实体类

package com.woniu.es.entity;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Getter
@Setter
@ToString
@Document(indexName = "t_book", shards = 1, replicas = 0)
public class EsBook implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Field(name = "id", type = FieldType.Long)
    private Long id;

    @Field(name = "name", type = FieldType.Text, analyzer = "ik_max_word")
    private String name;

    @Field(name = "typeId", type = FieldType.Integer)
    private Integer typeId;

    @Field(name = "provider", type = FieldType.Text, analyzer = "ik_max_word")
    private String provider;

    @Field(name = "author", type = FieldType.Keyword)
    private String author;

    @Field(name = "price", type = FieldType.Double)
    private BigDecimal price;

    @Field(name = "imgsrc", type = FieldType.Keyword)
    private String imgsrc;

    @Field(name = "createtime", type = FieldType.Date, format = DateFormat.date_hour_minute_second_millis)
    private LocalDateTime createtime;
}

4.新建实体类接口

package com.woniu.es.dao;

import com.woniu.es.entity.EsBook;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EsBookRepository extends ElasticsearchRepository<EsBook, Long> {

}

5.xml文件中编写sql语句

 <select id="selectBookForElasticSearch" resultType="com.woniu.es.entity.EsBook">
        SELECT * FROM t_book
    </select>

6.测试类将数据存入es

 @Autowired
    private BookMapper bookMapper;
    @Autowired
    private EsBookRepository esBookRepository;

    @Test
    public void exportBooKToElasticSearch() {
        List<EsBook> esBookList = bookMapper.selectBookForElasticSearch();
        esBookRepository.saveAll(esBookList);
    }

7.自己编写es分页工具类

package com.woniu.util;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Data
@NoArgsConstructor
public class EsPageInfo<T> {
    //当前页码
    private Integer pageNum;
    //每页显示几条
    private Integer pageSize;
    //数据表一共有多少行
    private Integer totalSize;
    //总页数
    private Integer totalPage;

    private Integer prePage;

    private Integer nextPage;

    private Boolean hasPreviousPage;

    private Boolean hasNextPage;

    private List<Integer> navigatepageNums = new ArrayList<>();

    //每页显示数据列表
    private List<T> list;

    public void initData(Integer pageNum, Integer pageSize, Integer totalSize) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.totalSize = totalSize;

        this.totalPage = (int)Math.ceil(totalSize*1.0/pageSize) - 1;
        if(pageNum > 0) {
            this.prePage = pageNum - 1;
            this.hasPreviousPage = true;
        } else {
            this.prePage = 0;
            this.hasPreviousPage = false;
        }

        if(pageNum < this.totalPage) {
            this.nextPage = pageNum + 1;
            this.hasNextPage = true;
        } else {
            this.nextPage = this.totalPage;
            this.hasNextPage = false;
        }

        for(int i=-2; i<=2; i++) {
            int jsPageNum = this.pageNum + i;
            if(jsPageNum >=0 && jsPageNum <= this.totalPage) {
                this.navigatepageNums.add(jsPageNum);
            }
        }
    }
}

8. 控制器代码

package com.woniu.controller;


import com.github.pagehelper.PageInfo;
import com.woniu.dto.BookDto;
import com.woniu.entity.Book;
import com.woniu.entity.Booktype;
import com.woniu.es.entity.EsBook;
import com.woniu.service.IBookService;
import com.woniu.service.IBooktypeService;
import com.woniu.util.CookieUtil;
import com.woniu.util.EsPageInfo;
import com.woniu.util.JwtTokenUtil;
import com.woniu.util.ResponseResult;
import lombok.RequiredArgsConstructor;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author wdn
 * @since 2022-12-20
 */
@Controller
@RequestMapping("/book")
@RequiredArgsConstructor
public class BookController {

    private final IBookService bookService;

    private final IBooktypeService booktypeService;

    private final RedisTemplate redisTemplate;

    private final ElasticsearchOperations elasticsearchOperations;

    private final RabbitTemplate rabbitTemplate;


    @GetMapping("/searchName")
    @ResponseBody
    public ResponseResult<EsPageInfo<EsBook>> searchName(@RequestParam(defaultValue = "0", required = false) Integer pageNum,
                                                         @RequestParam(defaultValue = "5", required = false) Integer pageSize,
                                                         String name) {
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", name); //math 查询
        //FieldSortBuilder sortBuilder = SortBuilders.fieldSort("createtime").order(SortOrder.DESC); // createtime 倒序
        PageRequest pageRequest = PageRequest.of(pageNum, pageSize);     // 分页,注意这里跟 from,size 意义不一样,page是第几页,0表示第一页

        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(matchQueryBuilder);
        //nativeSearchQueryBuilder.withSort(sortBuilder);
        nativeSearchQueryBuilder.withPageable(pageRequest);
        NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();

        SearchHits<EsBook> search = elasticsearchOperations.search(nativeSearchQuery, EsBook.class, IndexCoordinates.of("t_book"/*索引名*/));
        Iterator<SearchHit<EsBook>> iterator = search.iterator();
        List<EsBook> esBookList = new ArrayList<>();

        while (iterator.hasNext()) {
            SearchHit<EsBook> next = iterator.next();
            esBookList.add(next.getContent());
        }

        EsPageInfo<EsBook> pageInfo = new EsPageInfo<>();
        pageInfo.initData(pageNum, pageSize, (int)search.getTotalHits());
        pageInfo.setList(esBookList);
        return new ResponseResult<>(200, "ok", pageInfo);
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值