SpringBoot整合Elasticsearch

Elasticsearch使用

  1. 注意在es使用时要注意springBoot和spring-data-elasticsearch以及elasticsearch的版本对应关系
    在这里插入图片描述
  2. es分词器
  • Analysis:文本分析–把全文文本转换为一系列单词的过程 。Analysis是通过Analuzer来实现 (分词就是将文档通过Analuzer分成一个一个的Term[关键词查询],每一个Term都指向包含这个Term的文档)

  • Analyzer组成:character filters , tokenizers , token filters

    • character filters–字符过滤器,在文本进行分词之前,先进行预处理,比如过滤html标签
    • tokenizers – 分词器, 英文分词根据空格将单词分开,中文采用机器学习算法分词
    • token filters – Token过滤器 , 将切分的单词进行加工,比如大小写转换,去掉停用词,加入同义词
  • 内置分词器

    • Standard 默认分词器(英文按单词切分,并小写处理;中文单字分词)
    • Simple 按照单词切分 (符号被过滤,小写处理;中文按照空格进行分词)
    • Stop 小写处理(停用词过滤 a the is)
    • Whitespace 按空格切分 (中英文按空格分词,不转小写)
    • Keyword Analyzer 不分词(直接将输入当输出)
  1. 国内对中文友好分词,建议使用IK分词器 下载elasticsearch-analysis-ik.zip 版本要和elasticearch一致(ik_smart 粗颗粒; ik_max_word 细颗粒)

    • 智能模式:对应es的IK插件的ik_smart,会做最粗粒度的拆分。比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。

    • 细粒度模式:对用es的插件ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,华,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query。

  2. springBoot整合

    • 导入依赖:

       <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
       </dependency>
      
    • 在配置文件application.properties 中配置 ES 的相关参数

      spring:
        elasticsearch:
          uris: http://ip:9200
      
    • es对象映射(项目启动,es文档会自动生成)

      参考连接:https://blog.csdn.net/chenxihua1/article/details/103311138

      /**
       * 这个创建索引的过程,最主要是从 @Document 注解中的 createIndex = false 这个属性开始,
       *因为 createIndex默认是true, 所以项目启动的时候,默认就会初始化这个索引
       *所以,就必须把它设置为 false。
       */
      //@Document定义在Elasticsearch中索引信息
      @Document(indexName = "article", createIndex = false)  
      @Data
      public class Article {
      
        @Id  // @Id定义了Elasticsearch的_id
        private String id;
      
        // ik分词 细颗粒度   比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,华,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query。
        @Field(type = FieldType.Text,analyzer = "ik_max_word")   // analyzer 分词类型
        private String title;
      
        // ik分词 粗颗粒度  比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
        @Field(type = FieldType.Text,analyzer = "ik_smart")  //@Field定义字段类型等信息
        private String description;
        
        @Field(type = FieldType.Double)
        private Double price;
      
        @Field(type = FieldType.Nested,includeInParent = true)
        private List<Author> authors;
      }
      

      注意:创建实体仓库:注意没有这一步,即便在实体上方设置@Document(indexName = “article”),springboot启动也不会创建mapping

    • 创建接口Repository(ElasticsearchRepository接口定义了Elasticsearch的CRUD , 通过定义的方法名就能自动创建各种查询 , 跟 JpaRepository 类似)

      @Repository
      public interface ArticleRepository extends ElasticsearchRepository<Article, String>  {
           	// findAll()   、save()  、  deleteById()
      }
      
    • controller

      @RestController
      public class ArticleController {
      
          @Autowired
          private ArticleService articleService;
      	
      	@GetMapping("/findAll")
          public List<Article> findAllArticle(){
              return articleService.findAllArticle();
          }
          
          @PostMapping("/searchArticle/{params}")
          public List<Article> searchArticle(@PathVariable("params") String params){
              return articleService.searchArticle(params);
          }
      }
      
    • service

      @Service
      public class ArticleService {
      	 @Autowired
           private ArticleRepository articleRepository;
           
      	 public List<Article> findAllArticle() {
              Iterable<Article> all = articleRepository.findAll();
              List<Article> articles = new ArrayList<>();
              all.forEach( e-> {
                  articles.add(e);
              });
              return articles;
          }
          
           public List<Article> searchArticle(String params) {
              BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
              // 文档 必须 匹配这些条件才能被包含进来。
              boolQueryBuilder.must(QueryBuilders.matchQuery("title",params));
              // 如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
              boolQueryBuilder.should(QueryBuilders.matchQuery("description",params));
              NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder()
                      .withQuery(boolQueryBuilder);
              NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
              SearchHits<Article> searchHits = elasticsearchRestTemplate.search(nativeSearchQuery, Article.class);
              List<Article> articles = new ArrayList<>();
              searchHits.forEach(articleSearchHit -> {
                  articles.add(articleSearchHit.getContent());
              });
              return articles;
          }
          
          
      }
      
    • 参数查询语句,参考连接:https://www.cnblogs.com/eternityz/p/17039586.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值