在公共服务集成ElasticSearch进行简单的crud和高级查询

    技术2022-07-12  81

    在公共服务集成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); }); } }
    Processed: 0.009, SQL: 9