• Es结合springboot(笔记回忆)


    导包

    1. org.springframework.boot
    2. spring-boot-starter-data-elasticsearch
    3. org.springframework.boot
    4. spring-boot-starter-test

    配置

    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 {
    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 search = userDocRepository.search(builder.build());
    6. NativeSearchQuery build = builder.build();
    7. Page search = userDocRepository.search(build);
    8. // 添加查询条件,添加排序条件,添加分页条件,将es的分页对象转换为自己的对象
    9. PageList 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 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 must = boolQuery.must();
    18. // must.add(QueryBuilders.matchQuery("age","15"));
    19. // queryBuilder.withQuery()
    20. List 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 search = userDocRepository.search(build);
    28. // 添加查询条件,添加排序条件,添加分页条件,将es的分页对象转换为自己的对象
    29. PageList empDocPageList = new PageList<>(search.getTotalElements(), search.getContent());
    30. System.out.println(empDocPageList);
    31. }

    这篇文章是写的真的好,一下子对es的结构和查询都了解完了

    Elasticsearch的多种查询方式_elasticsearch 查询-CSDN博客

  • 相关阅读:
    国产高速光耦OR-2630、OR-2631,对标ICPL2630,质优价廉
    html从零开始9:javaScript简介,语句、标识符,变量,JavaScript引入到文件【搬代码】
    黑盒测试用例设计 - 因果图法
    okcc呼叫中心所选的客户服务代表应该具备什么条件?
    JVM学习(五)--方法区
    企业直播怎么从公域引流
    5. 最长回文子串
    C#:枚举是命名的整形常量的集合
    Web系统常见安全漏洞介绍及解决方案-XSS攻击
    在哪里考华为认证更容易?
  • 原文地址:https://blog.csdn.net/m0_51798113/article/details/140048152