2021-2-17 ElasticSearch 与 java联合

引入maven

 		<dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>2.3.9</version>
        </dependency>

        <!--整合rabbitmq-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

java

创建持久层

package com.qizhi.search.mode;

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BookRepository extends ElasticsearchRepository<BookEs,Long> {

}

实体类

package com.qizhi.search.mode;

import lombok.Data;
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.util.Date;

@Data
@Document(indexName = "book",createIndex = true)
public class BookEs {

    @Id
    private long id;

    @Field(analyzer = "ik_smart",searchAnalyzer = "ik_max_word")
    private String title;

    @Field(type = FieldType.Text)
    private String summary;

    @Field(type = FieldType.Text)
    private String createuser;

    @Field(type = FieldType.Date, format = DateFormat.date_optional_time)
    private Date createdate;
}

service层

package com.qizhi.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qizhi.pojo.EbookEntry;
import com.qizhi.search.mode.mq.BookEsIndexMessage;
import com.qizhi.search.mode.mq.MqMessageHandle;

import java.util.List;

/**
 * elasticsearch 索引 类型 记录  4.0不推荐设置类型 默认为_doc
 * 关系型数据库 -》 elasticsearch 索引
 * 表 -》 类型
 * 记录-》记录
 */
public interface SearchService {

    /**
     * 从 elastic 查询出来数据 用mybatis 的page 进行装在
     * @return
     */
    public Page search(Page page,String key);

    //初始化es 数据
    public int initEsData(List<EbookEntry> list);

    //创建或者修改记录 
    public void createOrUpdate(BookEsIndexMessage message);

    //删除记录
    public void removeIndex(BookEsIndexMessage message);
}

serviceImpl类

package com.qizhi.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qizhi.pojo.EbookEntry;
import com.qizhi.search.mode.BookEs;
import com.qizhi.search.mode.BookRepository;
import com.qizhi.search.mode.mq.BookEsIndexMessage;
import com.qizhi.service.EbookEntryService;
import com.qizhi.service.SearchService;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

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

@Service
public class SearchServiceImpl implements SearchService {

    @Autowired
    BookRepository repository;

    @Autowired
    ModelMapper modelMapper;

    @Autowired
    EbookEntryService ebookEntryService;

    @Override
    public Page search(Page page, String key) {
        /**
         * 创建elastic的 pageable数据
         */
        int current = (int) (page.getCurrent()-1);

        int size = (int) page.getSize();

        Pageable pageable = PageRequest.of(current,size);

        QueryBuilder queryBuilder =QueryBuilders.matchQuery("title",key);
        //搜索es的到pageData
        org.springframework.data.domain.Page document =repository.search(queryBuilder,pageable);
        // 结果信息 jpa的pageData转成mybatis plus的pageData
        Page pageData = new Page(page.getCurrent(), page.getSize(), document.getTotalElements());

        pageData.setRecords(document.getContent());

        return pageData;
    }
    @Override
    public int initEsData(List<EbookEntry> records){
        if (records == null || records.isEmpty()) {
            return 0;
        }

        List<BookEs> bookEs = new ArrayList<BookEs>();
        for (EbookEntry record : records) {
            BookEs bookEs1 =modelMapper.map(record,BookEs.class); //类型转换  参数一: 数据 参数二 转为什么类型
            bookEs.add(bookEs1);
        }
        repository.saveAll(bookEs);
        return bookEs.size();
    }
    @Override
    public void createOrUpdate(BookEsIndexMessage message) {

        //获得要增加的记录id
        long id = message.getId();

        //通过id 获得数据库实体
        EbookEntry byId = ebookEntryService.getById(id);
        //将从数据库查到的数据转为elastic 记录-》实体
        BookEs bookEs = modelMapper.map(byId,BookEs.class);
        repository.save(bookEs);
        System.out.println("es 索引更新成功"+bookEs.toString());
    }
    @Override
    public void removeIndex(BookEsIndexMessage message) {
        //获得要增加的记录id
        long id = message.getId();
        repository.deleteById(id);
        System.out.println("删除成功 ");
    }

}

controller层 进行数据库 es 同步数据

@ResponseBody
@GetMapping("/search")
 public Object search(String key){

     Page search = searchService.search(new Page(1,3),key);

     return search;
 }

@GetMapping("/del/{id}")
public String del(@PathVariable("id") long id){
    ebookEntryService.removeById(id);
    amqpTemplate.convertAndSend(RabbitMqConfig.ES_CHANGE,RabbitMqConfig.ES_BIND_KEY,
            new BookEsIndexMessage(id,BookEsIndexMessage.REMOVE));
    return "redirect:/list";
}

错误总结

一:

一般Elasticsearch 包引入 date类型 使用

@field(@Field(type = FieldType.Date,

format = DateFormat.date_optional_time))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大陈·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值