(实测阿里云es 6.7.0没问题,注意开启公网访问,用户名密码,以及设置好白名单,实际上高低版本的client支持6.x-7.x。 7.x以上取消type的概念,重写构造不同高低版本client代码即可兼容大部分es版本)
目前最新spring-data-es 是3.1.0 Elasticsearch模板还是不支持restClient连接 (据说3.2.0 会支持)
使用本框架 小项目,轻量级使用es的项目,快速方便的转换transport连接方式到restClient连接,还是使用spring-data-es的习惯,一套代码两种方式连接方式可跑。
我自己的是从自己搭建的es迁移到阿里云es 6.7.0 ,阿里云不支持transport 常用操作的封装,创建文档,查询总数,批量增加修改,批量删除,高亮显示
自由度不够,更多属性需要自己修改源码。
于spring-data-es不同点总结: 1.实体对象需要继承EsEntity,必须有id字段且其为string类型 且该字段需要标注@Field注解。 2.仓库对象 不再使用继承接口,需要继承EsRepository类。 3.没有动态生成方法。 但支持ElasticsearchRepository所有接口声明的方法
本来是想写工具类的,所以EsRestClient有反射代码的冗余 介意的话自己修改。
有点功能洁癖写着写着 还是当demo级别框架写 我自己是使用编译jar包 在别的项目中引入本"demo框架" 当做正常框架使用。 你可以抽离代码放到你的项目中,也可以选择和我一样编译jar,引入依赖。 我会在github上提供一份编译好的jar
本框架主要类目录结构 (详细目录结构在下方)
common_parent为框架父级总管理项目 data为次级管理项目 es-rest为框架项目
paper_site为 使用本框架示例 打开idea编译好common_parent项目 安装jar到本地
再打开paper_site项目(添加好依赖) 填写好yml配置信息 运行readm.paper.PaperApplicationTests.contextLoads 测试方法, 即可自动创建es文档 和相关测试代码 (注意打开相关注释等等)
文档对象声明 和 其字段声明
仓库对象定义
测试仓库方法
例子
仓库对象定义例子
package readm.paper.es.repository;
import lombok.NoArgsConstructor;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import readm.paper.es.pojo.SentenceEntity_ES;
import vip.readm.data.es.repository.EsRepository;
import javax.annotation.PostConstruct;
import java.util.List;
/**
* @Author: Readm
* @Date: 2019/8/14 4:29
* @Version 1.0
*/
@NoArgsConstructor
@Component
public class SentenceRepository_ES extends EsRepository<SentenceEntity_ES,String> {
}
文档实体声明
package readm.paper.es.pojo;
import lombok.*;
import lombok.experimental.Accessors;
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 vip.readm.data.es.pojo.EsEntity;
/**
* @Author: Readm
* @Date: 2019/8/14 4:29
* @Version 1.0
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode
@ToString
@AllArgsConstructor
@NoArgsConstructor
//@Document(indexName = "idx_paper", type = "sentence")
@Document(indexName = "idx_test_paper_test_003", type = "sentence")
public class SentenceEntity_ES extends EsEntity {
@Id
@Field(type = FieldType.Keyword,index = true,store = true)
private String id;
//用于按id排序
@Field(type = FieldType.Integer,index = true,store = false)
private Integer orderId;
public SentenceEntity_ES setId(String id){
this.id=id;
try {
orderId=Integer.parseInt(id);
}catch (Exception e){
}
return this;
}
//原句需要分词 用于搜索
@Field(type = FieldType.Text,index = true,store = true,searchAnalyzer="standard",analyzer="standard")
private String text;
public SentenceEntity_ES setText(String text){
this.text=text;
this.setFullText(text);
return this;
}
//原句不分词版
@Field(type = FieldType.Keyword,index = true,store = false)
private String fullText;
//翻译后的中文句子
@Field(type = FieldType.Text,index = true,store = true,searchAnalyzer="ik_smart",analyzer="ik_max_word")
private String translateText;
public SentenceEntity_ES setTranslateText(String translateText){
this.translateText=translateText;
this.fullTranslateText=translateText;
return this;
}
//翻译后的中文句子 不分词版本
@Field(type = FieldType.Keyword,index = true,store = false)
private String fullTranslateText;
//文章来源 目前没有用于搜索 ,但是还是建立下索引以防万一
@Field(type = FieldType.Keyword,index = true,store = true)
private String articleUrl;
//图片链接 目前没有用于搜索 ,但是还是建立下索引以防万一
@Field(type = FieldType.Keyword,index = true,store = true)
private String imgUrl;
//句子模块类型 需要被搜索 但是不分词
@Field(type = FieldType.Keyword,index = true,store = true)
private String type;
//原句md5
@Field(type = FieldType.Keyword,index = true,store = false)
private String textMd5;
}
编写业务代码使用仓库对象
package readm.paper.controller;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.*;
import readm.paper.es.pojo.SentenceEntity_ES;
import readm.paper.es.repository.SentenceRepository_ES;
import vip.readm.data.es.pojo.impl.Page;
import vip.readm.data.es.repository.EsRepository;
/**
* @Author: Readm
* @Date: 2019/8/16 16:25
* @Version 1.0
*/
@RestController
public class TestController {
@Autowired
SentenceRepository_ES sentenceRepository_es;
@GetMapping("/test")
public Object testGet(
@RequestParam(required = false) String q
){
MultiMatchQueryBuilder multiMatchQueryBuilder=QueryBuilders.multiMatchQuery("测试修改", "translateText","fullTranslateText");
Sort sort= Sort.by(Sort.Direction.ASC,"orderId");
Page<SentenceEntity_ES> page=new Page<>(0,10,sort);
HighlightBuilder highlightBuilder=null;
highlightBuilder= EsRepository.getHighlightBuilderFromFieldNames("translateText","fullTranslateText");
sentenceRepository_es.search(multiMatchQueryBuilder, null, page, highlightBuilder).getContent()
.forEach(item->{
System.out.println(item);
});
return "GetMapping q="+q;
}
@PostMapping("/test")
public Object testPost(
@RequestParam(required = false) String q
){
return "PostMapping q="+q;
}
@PutMapping("/test")
public Object testPut(
@RequestParam(required = false) String q
){
return "PutMapping q="+q;
}
@DeleteMapping("/test")
public Object testDelete(
@RequestParam(required = false) String q
){
return "DeleteMapping q="+q;
}
}
仓库对象使用2:
package readm.paper;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.index.reindex.UpdateByQueryRequest;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;
import readm.paper.es.pojo.SentenceEntity_ES;
import readm.paper.es.repository.SentenceRepository_ES;
import vip.readm.data.es.EsRestClient;
import vip.readm.data.es.config.EsConfig;
import vip.readm.data.es.pojo.impl.Page;
import vip.readm.data.es.repository.EsRepository;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class PaperApplicationTests {
@Autowired
RestHighLevelClient restHighLevelClient;
@Autowired
RestClient restClient;
@Autowired
SentenceRepository_ES sentenceRepository_es;
@Test
public void us(){
}
@Test
public void contextLoads() {
System.out.println(restHighLevelClient);
List<SentenceEntity_ES> sentencs=new ArrayList<>();
for(int i=0;i<3;i++){
SentenceEntity_ES sentenceEntity_es=new SentenceEntity_ES().setText(i+"test").setTranslateText("测试修改").setArticleUrl("www.baiar.com").setImgUrl("imgurl")
.setType("head").setTextMd5("5556");
sentencs.add(sentenceEntity_es);
}
Boolean bRes=false;
Integer nRes=0;
sentencs.get(0).setId("5");
sentencs.get(1).setId("8");
sentencs.get(2).setId("10");
sentenceRepository_es.saveAll(sentencs);
//bRes=sentenceRepository_es
// nRes=sentenceRepository_es.deleteAll(sentencs);
//System.out.println(sentenceRepository_es.deleteAll());
// System.out.println(res);
System.out.println("当前总数:"+sentenceRepository_es.count());
TermQueryBuilder termQueryBuilder= QueryBuilders.termQuery("translateText", "测试");
MultiMatchQueryBuilder multiMatchQueryBuilder=QueryBuilders.multiMatchQuery("测试修改", "translateText","fullTranslateText");
Sort sort= Sort.by(Sort.Direction.ASC,"orderId");
Page<SentenceEntity_ES> page=new Page<>(0,10,sort);
sentenceRepository_es.findAll(page).getContent().forEach(item ->{
System.out.println(item);
});
sentenceRepository_es.deleteAll();
sentenceRepository_es.findAll(page).getContent().forEach(item ->{
System.out.println(item);
});
sentenceRepository_es.saveAll(sentencs);
// 高亮设置
HighlightBuilder.Field highlightField = new HighlightBuilder.Field("translateText");
highlightField.highlighterType("unified");
HighlightBuilder.Field highlightField2 = new HighlightBuilder.Field("fullTranslateText");
highlightField2.highlighterType("unified");
HighlightBuilder highlightBuilder = new HighlightBuilder();
HighlightBuilder.Field highlightUser = new HighlightBuilder.Field("user");
highlightBuilder.field(highlightField);
highlightBuilder.field(highlightUser);
highlightBuilder.field(highlightField2);
System.out.println();
System.out.println();
System.out.println("=============================highlightBuilder===========================================");
sentenceRepository_es.search(multiMatchQueryBuilder, null, page, highlightBuilder).getContent()
.forEach(item->{
System.out.println(item);
});
System.out.println();
System.out.println();
System.out.println("=============================highlightBuilder utils===========================================");
highlightBuilder=null;
highlightBuilder= EsRepository.getHighlightBuilderFromFieldNames("translateText","fullTranslateText");
sentenceRepository_es.search(multiMatchQueryBuilder, null, page, highlightBuilder).getContent()
.forEach(item->{
System.out.println(item);
});
sentenceRepository_es.deleteAll();
System.out.println("=============================end===========================================");
sentenceRepository_es.findAll(page).getContent().forEach(item ->{
System.out.println(item);
});
}
@Test
public void test001(){
}
}