当前位置:   article > 正文

Es结合springboot(笔记回忆)

Es结合springboot(笔记回忆)

导包

  1. <!--导入es-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-test</artifactId>
  9. </dependency>

配置

  1. data:
  2. elasticsearch:
  3. cluster-name: elasticsearch
  4. cluster-nodes: 127.0.0.1:9300

9200,可以查看es信息

9300 内部用

9300是TCP协议端口号,ES集群之间通讯端口号

9200端口号,暴露ES RESTful接口端口号

searchAnalyzer 查的时候分词器
analyzer  存入的时候分词器

GET _cat/indices 相当于查询所有库

导入工具类

  1. import org.elasticsearch.client.transport.TransportClient;
  2. import org.elasticsearch.common.settings.Settings;
  3. import org.elasticsearch.common.transport.TransportAddress;
  4. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  5. import org.springframework.stereotype.Component;
  6. import java.net.InetAddress;
  7. import java.net.UnknownHostException;
  8. @Component
  9. public class ESClientUtil {
  10. public TransportClient getClient(){
  11. TransportClient client = null;
  12. Settings settings = Settings.builder()
  13. .put("cluster.name", "elasticsearch").build();
  14. try {
  15. client = new PreBuiltTransportClient(settings).addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
  16. } catch (UnknownHostException e) {
  17. e.printStackTrace();
  18. }
  19. return client;
  20. }
  21. }

创建实现增删改查的ES工厂,这个接口估计是模仿mybatis那个mapper,东施效颦罢了。

  1. package org.example.utils;
  2. import org.example.domain.EmpDoc;
  3. import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  4. import org.springframework.stereotype.Repository;
  5. //要穿一个类,然后文档对象id的类型,我们需要自己写一个接口类,并在接口类上打一个注解,注入到spring容器
  6. /**
  7. * 这个Repository 类似与mybatis中的mapper接口
  8. * 这个接口不需要实现类,我们到时候如果想对文档crud,只需要注入这个接口类就可以了。
  9. * 反正就是动态代理嘛,自动生成动态代理类,自动将代理实现类交给spring管理,所以我们注入这个接口类
  10. * 就可以使用这个接口类的方法,实现文档的crud
  11. */
  12. @Repository
  13. public interface UserDocRepository extends ElasticsearchRepository<EmpDoc,Long> {
  14. }

我们创建索引库的话,可以通过注解实体类来创建es库

  1. package org.example.domain;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.springframework.data.annotation.Id;
  6. import org.springframework.data.elasticsearch.annotations.Document;
  7. import org.springframework.data.elasticsearch.annotations.Field;
  8. import org.springframework.data.elasticsearch.annotations.FieldType;
  9. import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  10. import org.springframework.stereotype.Repository;
  11. @Data
  12. @AllArgsConstructor
  13. @NoArgsConstructor
  14. //这里指明了
  15. @Document(indexName = "test",type = "emp")
  16. public class EmpDoc{
  17. @Id //文档id字段
  18. private Long id;
  19. @Field(type = FieldType.Keyword) //不分词
  20. private String name;
  21. @Field(type = FieldType.Integer)
  22. private Integer age;
  23. @Field(type = FieldType.Text,analyzer = "ik_smart"
  24. ,searchAnalyzer = "ik_smart")
  25. private String intro;
  26. }
@Document(indexName = "test",type = "emp")

指明了在es中的位置和地址,text分词查询,keyword不分词哈。

开始操作

  1. @Autowired
  2. private ElasticsearchTemplate elasticsearchTemplate;

创建索引库

  1. @Test
  2. public void test05(){
  3. // boolean index = elasticsearchTemplate.createIndex("spring-demo");
  4. // System.out.println(index);
  5. elasticsearchTemplate.createIndex(EmpDoc.class);
  6. elasticsearchTemplate.putMapping(EmpDoc.class);
  7. }
  1. @Test
  2. public void test06(){
  3. EmpDoc empDoc = new EmpDoc();
  4. empDoc.setAge(12);
  5. empDoc.setIntro("zzzz");
  6. empDoc.setId(1l);
  7. empDoc.setName("zs");
  8. userDocRepository.save(empDoc);
  9. }
  1. @Test
  2. public void test07(){
  3. System.out.println(userDocRepository.findById(1l).get());
  4. }

其余操作就很简单了,简单的增删改查没意思,直接快进到聚合查询,我就是为了回忆聚合查询,才开始又慢慢看es的

  1. @Test
  2. public void test08(){
  3. // 创建一个查询构建器对象
  4. NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
  5. // Page<EmpDoc> search = userDocRepository.search(builder.build());
  6. NativeSearchQuery build = builder.build();
  7. Page<EmpDoc> search = userDocRepository.search(build);
  8. // 添加查询条件,添加排序条件,添加分页条件,将es的分页对象转换为自己的对象
  9. PageList<EmpDoc> empDocPageList = new PageList<>(search.getTotalElements(), search.getContent());
  10. System.out.println(empDocPageList);
  11. }

build去拿searquery对象,为什么要去拿searchquery对象呢?因为search方法要searchquery,才会返回值。

然后这个返回的值里面有很多方法,就可以拿到totals啥的。

分页

queryBuilder.withPageable(PageRequest.of(0,10));

对了,这个方法要的是接口,所以我们要找接口的实现类。是这个方法是要接口吗,我有点记不清了。

成功哈

关键字查询,范围查询,条件查询

我们要先搞清楚

query -> bool -> must(match)/filter(term/range)的顺序

然后

queryBuilder.withQuery(boolQuery);

这个方法可以放入一个boolQuery,这个boolQuery我们可以弄很多的聚合查询在其中

bool中有must关键查询和filter范围查询和过滤查询

must 多个属性都可以关键字查询

mutiMatchQuery 匹配多个字段,多字段分词查询

must——》match关键字查询

filter-》term 是条件查询

filter-》range是范围查询

反正一切都在代码中了哈

  1. @Test
  2. public void test08(){
  3. // 创建一个查询构建器对象
  4. NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
  5. // Page<EmpDoc> search = userDocRepository.search(builder.build());
  6. //条件查询
  7. FieldSortBuilder age = SortBuilders.fieldSort("age").order(SortOrder.DESC);
  8. queryBuilder.withSort(age);
  9. // 分页查询
  10. queryBuilder.withPageable(PageRequest.of(0,10));
  11. // 关键字,分词查询还是不分词查询,是分词查询,包含关键字会查询出来。
  12. // dsl结构,要记得住,不然理解不到
  13. // query -> bool -> must(match)/filter(term/range)
  14. // mutiMatchQuery 多字段
  15. // 直接先到bool层
  16. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  17. // List<QueryBuilder> must = boolQuery.must();
  18. // must.add(QueryBuilders.matchQuery("age","15"));
  19. // queryBuilder.withQuery()
  20. List<QueryBuilder> filter = boolQuery.filter();
  21. // filter.add(QueryBuilders.termQuery("id",3));
  22. // 词元查询
  23. // 年龄
  24. filter.add(QueryBuilders.rangeQuery("age").gte(15).lte(20));
  25. queryBuilder.withQuery(boolQuery);
  26. NativeSearchQuery build = queryBuilder.build();
  27. Page<EmpDoc> search = userDocRepository.search(build);
  28. // 添加查询条件,添加排序条件,添加分页条件,将es的分页对象转换为自己的对象
  29. PageList<EmpDoc> empDocPageList = new PageList<>(search.getTotalElements(), search.getContent());
  30. System.out.println(empDocPageList);
  31. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/779156
推荐阅读
相关标签
  

闽ICP备14008679号