当前位置:   article > 正文

EelasticSearch使用

EelasticSearch使用

1. Easy-ES介绍

Easy-Es

2. 导入依赖包

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>//排除框架中原有的依赖包
  5. <exclusion>
  6. <groupId>org.elasticsearch.client</groupId>
  7. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  8. </exclusion>
  9. <exclusion>
  10. <groupId>org.elasticsearch</groupId>
  11. <artifactId>elasticsearch</artifactId>
  12. </exclusion>
  13. </exclusions>
  14. </dependency>
  15. <dependency>
  16. <groupId>cn.easy-es</groupId>
  17. <artifactId>easy-es-boot-starter</artifactId>
  18. <version>2.0.0-beta1</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.elasticsearch.client</groupId>
  22. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  23. <version>7.14.0</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.elasticsearch</groupId>
  27. <artifactId>elasticsearch</artifactId>
  28. <version>7.14.0</version>
  29. </dependency>

在实体属性上添加注解 

  1. package com.yy.model;
  2. import cn.easyes.annotation.IndexField;
  3. import cn.easyes.annotation.IndexId;
  4. import cn.easyes.annotation.IndexName;
  5. import cn.easyes.annotation.rely.Analyzer;
  6. import cn.easyes.annotation.rely.FieldType;
  7. import cn.easyes.annotation.rely.IdType;
  8. import lombok.AllArgsConstructor;
  9. import lombok.Builder;
  10. import lombok.Data;
  11. import lombok.NoArgsConstructor;
  12. import java.math.BigDecimal;
  13. import java.time.LocalDateTime;
  14. import java.util.List;
  15. @Data
  16. @Builder
  17. @AllArgsConstructor
  18. @NoArgsConstructor
  19. @IndexName(aliasName = "Es_product")//起别名,不起别名每次都要重新刷新
  20. public class EsProduct {
  21. @IndexId(type = IdType.CUSTOMIZE)
  22. private Integer id;
  23. @IndexField(fieldType = FieldType.TEXT)
  24. private String name;
  25. @IndexField(fieldType = FieldType.INTEGER)
  26. private Integer categoryId;
  27. @IndexField(fieldType = FieldType.DOUBLE)
  28. private BigDecimal price;
  29. @IndexField(fieldType = FieldType.TEXT)
  30. private String brief;
  31. @IndexField(fieldType = FieldType.KEYWORD)
  32. private String img;
  33. @IndexField(fieldType = FieldType.TEXT)
  34. private List<String> tags;
  35. @IndexField(fieldType = FieldType.INTEGER)
  36. private Integer highOpinion;
  37. @IndexField(fieldType = FieldType.INTEGER)
  38. private Integer salesVolume;
  39. @IndexField(fieldType = FieldType.DATE)
  40. private LocalDateTime productionDate;
  41. }

 新建mapper类

  1. package com.yy.dao;
  2. import cn.easyes.core.core.BaseEsMapper;
  3. import cn.easyes.starter.register.EsMapperScan;
  4. import com.yy.model.EsProduct;
  5. import org.springframework.stereotype.Component;
  6. @Component
  7. public interface EsProductMapper extends BaseEsMapper<EsProduct> {
  8. }

在application.properties文件中配置 ES

  1. # Easy-Es配置部分
  2. easy-es:
  3. # 启用Easy-Es功能
  4. enable: true
  5. # 设置Elasticsearch服务器地址和端口
  6. address: 192.168.23.27:9200
  7. # 全局配置项,设置是否打印执行的DSL语句(便于调试)
  8. global-config:
  9. print-dsl: true

Elasticsearch DSL (Domain Specific Language) 是一种专门设计用来与Elasticsearch搜索引擎进行交互的查询语言。它是一种基于JSON格式的查询语法,允许用户以结构化的方式来构建复杂的查询、过滤条件、聚合操作以及其他高级功能。

通过Elasticsearch DSL,开发人员可以灵活且高效地执行各种查询操作,包括全文本搜索、精确匹配、范围查询、布尔组合查询、排序、分页、高亮显示文本、统计计算、地理位置查询以及复杂的聚合分析等。

例如,一个简单的Elasticsearch DSL查询语句可能是查找索引my_indexfield1字段包含关键词value1的文档:

{
  "query": {
    "match": {
      "field1": "value1"
    }
  }
}

在这个例子中,query对象封装了一个match查询,用于查找匹配给定字段内容的文档。

Elasticsearch还提供了多种客户端库,比如Elasticsearch官方提供的Java、Python、JavaScript等客户端,以及像elasticsearch-dsl这样的高级库,使得开发人员能够以更加面向对象或更符合各编程语言习惯的方式来构建和执行这些DSL查询语句。

 编写测试对索引(相当于数据库中的表)进行创建、删除、查询索引

  1. package com.yy;
  2. import cn.easyes.core.biz.EsPageInfo;
  3. import cn.easyes.core.conditions.select.LambdaEsQueryWrapper;
  4. import cn.hutool.core.collection.CollUtil;
  5. import com.yy.dao.EsProductMapper;
  6. import com.yy.model.EsProduct;
  7. import org.junit.jupiter.api.Test;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.boot.test.context.SpringBootTest;
  10. import java.math.BigDecimal;
  11. import java.time.LocalDateTime;
  12. import java.util.List;
  13. @SpringBootTest
  14. class UserEsTests {
  15. @Autowired
  16. private EsProductMapper esProductMapper;
  17. //创建索引,一般也不用单独创建索引,操作时会默认自动创建
  18. @Test
  19. void test1() {
  20. // Boolean b = esMapper.createIndex();
  21. }
  22. //插入单条
  23. @Test
  24. void test2() {
  25. EsProduct esProduct = EsProduct.builder()
  26. .id(1)
  27. .name("小米")
  28. .img("图片地址")
  29. .brief("小米(MI)Redmi Note12 5G 120Hz OLED屏幕 骁龙4移动平台 5000mAh长续航 8GB+128GB子夜黑 小米红米")
  30. .price(new BigDecimal(18))
  31. .categoryId(1)
  32. .highOpinion(20)
  33. .productionDate(LocalDateTime.now())
  34. .salesVolume(99)
  35. .tags(CollUtil.newArrayList("120高刷", "舒适护眼"))
  36. .build();
  37. esProductMapper.insert(esProduct);
  38. }
  39. //批量插入
  40. @Test
  41. void test3() {
  42. List<EsProduct> esProducts = CollUtil.newArrayList();
  43. for (int i = 1; i <= 10; i++) {
  44. EsProduct esProduct = EsProduct.builder()
  45. .id(i)
  46. .name("小米"+i)
  47. .img("图片地址"+i)
  48. .brief("小米(MI)Redmi Note"+i+" 5G 120Hz OLED屏幕 骁龙4移动平台 5000mAh长续航 8GB+128GB子夜黑 小米红米")
  49. .price(new BigDecimal(500.36+i))
  50. .categoryId(1)
  51. .highOpinion(100+i)
  52. .productionDate(LocalDateTime.now())
  53. .salesVolume(200+i)
  54. .tags(CollUtil.newArrayList("12"+i+"高刷","舒适护眼"))
  55. .build();
  56. esProducts.add(esProduct);
  57. }
  58. esProductMapper.insertBatch(esProducts);
  59. }
  60. //删除
  61. @Test
  62. void test4() {
  63. esProductMapper.deleteBatchIds(CollUtil.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
  64. }
  65. @Test
  66. void update() {
  67. EsProduct esProduct = EsProduct.builder()
  68. .id(1)
  69. .name("su7------------------")
  70. .img("图片地址")
  71. .brief("小米汽车")
  72. .price(new BigDecimal(18))
  73. .categoryId(9)
  74. .highOpinion(20)
  75. .productionDate(LocalDateTime.now())
  76. .salesVolume(99)
  77. .tags(CollUtil.newArrayList("120高刷","舒适护眼"))
  78. .build();
  79. Integer integer = esProductMapper.updateById(esProduct);
  80. }
  81. //查询id等于1d的数据
  82. @Test
  83. void select() {
  84. LambdaEsQueryWrapper queryWrapper = new LambdaEsQueryWrapper<EsProduct>();
  85. queryWrapper.eq("id",1);
  86. List list = esProductMapper.selectList(queryWrapper);
  87. }
  88. @Test
  89. void select2() {
  90. LambdaEsQueryWrapper queryWrapper = new LambdaEsQueryWrapper<EsProduct>();
  91. queryWrapper.queryStringQuery("汽车之家"); //所有字段都去匹配
  92. List list = esProductMapper.selectList(queryWrapper);
  93. }
  94. @Test
  95. void select3() {
  96. LambdaEsQueryWrapper queryWrapper = new LambdaEsQueryWrapper<EsProduct>();
  97. queryWrapper.eq("categoryId",1);
  98. List list = esProductMapper.selectList(queryWrapper);
  99. }
  100. @Test
  101. void select4() {
  102. LambdaEsQueryWrapper<EsProduct> queryWrapper = new LambdaEsQueryWrapper<>();
  103. queryWrapper.in(EsProduct::getCategoryId,1,9);
  104. List list = esProductMapper.selectList(queryWrapper);
  105. }
  106. @Test
  107. void select5() {
  108. LambdaEsQueryWrapper<EsProduct> queryWrapper = new LambdaEsQueryWrapper<>();
  109. //queryWrapper.match(EsProduct::getBrief,"汽车",1.0F);
  110. //queryWrapper.match(EsProduct::getName,"汽车",1.0F);
  111. //queryWrapper.multiMatchQuery("汽车", Operator.OR, EsProduct::getName,EsProduct::getBrief);
  112. queryWrapper.in("categoryId",1,9); //where categroyId in (1,9) and ( name like '%汽车%' or brief like '%汽车%')
  113. queryWrapper.and(
  114. w->w.match(EsProduct::getBrief,"汽车",1.0F)
  115. .or().match(EsProduct::getName,"汽车",2.0F));
  116. List list = esProductMapper.selectList(queryWrapper);
  117. String dsl = esProductMapper.getSource(queryWrapper);
  118. System.out.println(dsl);
  119. }
  120. @Test
  121. void select6() {
  122. LambdaEsQueryWrapper<EsProduct> queryWrapper = new LambdaEsQueryWrapper<>();
  123. queryWrapper.in("categoryId",1,9); //where categroyId in (1,9) and ( name like '%汽车%' or brief like '%汽车%')
  124. queryWrapper.and(
  125. w->w.match(EsProduct::getBrief,"高刷",1.0F)
  126. .or().match(EsProduct::getName,"高刷",2.0F)
  127. .or().match(EsProduct::getTags,"高刷",1.0F));
  128. queryWrapper.orderByDesc(EsProduct::getSalesVolume);
  129. EsPageInfo<EsProduct> esProductEsPageInfo = esProductMapper.pageQuery(queryWrapper, 2, 3);
  130. String dsl = esProductMapper.getSource(queryWrapper);
  131. System.out.println(dsl);
  132. }
  133. @Test
  134. void select7() {
  135. LambdaEsQueryWrapper<EsProduct> queryWrapper = new LambdaEsQueryWrapper<>();
  136. queryWrapper.match(EsProduct::getName,"水汽车门");
  137. List<EsProduct> esProducts = esProductMapper.selectList(queryWrapper);
  138. }
  139. }

 原生Api调用

1查看索引mapping关系

GET /es_product/_mapping

2查看某个文档,具体字段的分词

GET /product/_doc/2/_termvectors?fields=brief

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号