在公共服务集成ElasticSearch进行简单的crud和高级查询
- 导入elasticsearch依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
- 配置文件yml,配置ElasticSearch的集群名字 集群节点ES地址,(如果使用了config记住传到云端)
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1010/eureka/
instance:
prefer-ip-address: true
instance-id: common-server:1060
spring:
application:
name: common-server
data: #配置ES 集群名字 集群节点ES地址
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 127.0.0.1:9300 #9200是图形界面端,9300代码端
server:
port: 1060
- 3 创建文档对象
package cn.itsource.wyj.doc;
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;
@Document(indexName = "hrm-es",type = "course")//创建文档 索引库 类型
public class Coursedoc {
@Id
private Long id;
//指定字段类型 为text 分词器 搜索器
@Field(type = FieldType.Text,analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
private String name;
@Field(type = FieldType.Float)
private float price;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString() {
return "doc{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
'}';
}
}
- 定义Repository,自定义查询
- 创建一个类继承ElasticsearchRepository<Coursedoc,Long> 泛型为文档对象,和文档对象id的类型
package cn.itsource.wyj.repository;
import cn.itsource.wyj.doc.Coursedoc;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository//交给spring管理
public interface CourseElasticsearchRepository extends ElasticsearchRepository<Coursedoc,Long> {
}
进行简单的crud和高级查询
package cn.itsource.wyj;
import cn.itsource.wyj.repository.CourseElasticsearchRepository;
import cn.itsource.wyj.doc.Coursedoc;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Optional;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = CommonApplication.class)
public class EsTest {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
private CourseElasticsearchRepository courseElasticsearchRepository;
@Test
public void createIndex(){
//创建索引库
elasticsearchTemplate.createIndex(Coursedoc.class);
//文档映射
elasticsearchTemplate.putMapping(Coursedoc.class);
}
//文档添加
@Test
public void testDocumentAdd(){
Coursedoc coursedoc=new Coursedoc();
for(int i=0; i<20;i++){
coursedoc.setId((1l+i));
coursedoc.setName("王大哥");
coursedoc.setPrice(16+i);
courseElasticsearchRepository.save(coursedoc);
}
}
//文档获取
@Test
public void testFind(){
Optional<Coursedoc> byId = courseElasticsearchRepository.findById(1l);
System.out.println(byId.get());
}
//文档删除
@Test
public void testDelete(){
courseElasticsearchRepository.deleteById(1l);
testFind();
}
//高级查询
//需求:查询课程名 name 中包含 java : DSL查询 - must - match
// 价格 price 在 1000 - 3000 : DSL过滤 - filter - range
// 每页 10 条,取第一页 ,按照价格倒排
@Test
public void test(){
//构建本地查询bulider
NativeSearchQueryBuilder nativeSearchQueryBuilder=new NativeSearchQueryBuilder();
//组合查询
BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
//添加查询条件 名字带王的
boolQueryBuilder.must(QueryBuilders.matchQuery("name","王"));
//价格在20-40间的
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(20).lte(30));
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
//按照价格倒叙排列
nativeSearchQueryBuilder.withSort(new FieldSortBuilder("price").order(SortOrder.DESC));
//每页 10 条,取第一页
nativeSearchQueryBuilder.withPageable(PageRequest.of(0,10));
//创建查询对象 执行查询
NativeSearchQuery searchQuery=nativeSearchQueryBuilder.build();
//得到查询结果
Page<Coursedoc> res = courseElasticsearchRepository.search(searchQuery);
System.out.println("总条数"+res.getTotalElements());
System.out.println("总页数"+res.getTotalPages());
List<Coursedoc> content = res.getContent();//结果
content.forEach(coursedoc -> {
System.out.println(coursedoc);
});
}
}