Java - ElasticSearch 4.0
引入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
))