SpringBoot集成 Spring-Data-ElasticSearch

Elasticsearch Java API有四类client连接方式

  • TransportClient(不推荐)
  • RestClient
  • Jest(不推荐)
  • Spring Data Elasticsearch

其中TransportClient和RestClient是Elasticsearch原生的api。TransportClient可以支持2.x,5.x版本,TransportClient将会在Elasticsearch 7.0弃用并在8.0中完成删除,替而代之,我们使用Java High Level REST Client,它使用HTTP请求而不是Java序列化请求。
Jest是Java社区开发的,是Elasticsearch的Java Http Rest客户端;
RestClient官方提供的高阶、低阶Rest Client,官方维护,比较值得信赖
Spring Data Elasticsearch是spring集成的Elasticsearch开发包。

建议:
TransportClient将会在后面的版本中弃用,使用原生API操作ES,代码量大,撰写困难,因此不推荐后续使用;
Jest由于是社区维护,所以更新有一定延迟,目前最新版对接ES6.3.1,近一个月只有四个issue,说明整体活跃度较低,因此也不推荐使用;
Spring Data Elasticsearch主要是与Spring生态对接,可以在web系统中整合到Spring中使用,与SpringBoot,SpringData版本容易冲突
Rest Client目前比较推荐使用官方的高阶、低阶Rest Client,官方维护,比较值得信赖。本文主要介绍RestClient,其他的只做简单概述。

下面主要就推荐的两种方式提供一个demo作为参考

未完待续…

Rest Client

Spring Data Elasticsearch

官方文档:https://docs.spring.io/spring…
中文翻译:https://www.jianshu.com/p/27e…
入门参考:https://www.cnblogs.com/guozp…

Spring boot 2的spring-boot-starter-data-elasticsearch中支持的Elasticsearch 2.X版本,需要转向spring-data-elasticsearch,
https://github.com/spring-projects/spring-data-elasticsearch
文档参考如下
https://docs.spring.io/spring-data/elasticsearch/docs/3.2.0.RC3/reference/html/#preface.versions
个版本对应如下,注意版本不兼容问题

spring data elasticsearch elasticsearch
3.2.x 6.5.0
3.1.x 6.2.2
3.0.x 5.5.0
2.1.x 2.4.0
2.0.x 2.2.0
1.3.x 1.5.2

一、配置
spring-boot 2.0.2
spring-data-elasticsearch 3.0.7
elasticsearch 6.5.0 因为ES7.0对应的springboot官方还没有出现匹配的版本,只能降级使用6.5对应的版本

  1. Maven依赖
    
    
        4.0.0
    
        
            org.springframework.boot
            spring-boot-starter-parent
            2.0.2.RELEASE
            
        
        
        
            
                org.springframework.boot
                spring-boot-starter-data-elasticsearch
            
        
    
  1. application.yml配置
spring:
   data:
        elasticsearch:
            #cluster-name: #默认为elasticsearch
            cluster-nodes: 127.0.0.1:9300 #配置es节点信息,逗号分隔,如果没有指定,则启动ClientNode(9200端口是http查询使用的。9300集群使用。这里使用9300.)
            properties:
                path:
                  logs: ./elasticsearch/log #elasticsearch日志存储目录
                  data: ./elasticsearch/data #elasticsearch数据存储目录

@Document

@Document注解里面的几个属性,类比mysql的话是这样:

index –> DB   
type –> Table   
Document –> row   

加上@Id注解后,在Elasticsearch里对应的该列就是主键了,在查询时就可以直接用主键查询。其实和mysql非常类似,基本就是一个数据库。

@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {
   String indexName();//索引库的名称,个人建议以项目的名称命名
   String type() default "";//类型,个人建议以实体的名称命名
   short shards() default 5;//默认分区数
   short replicas() default 1;//每个分区默认的备份数
   String refreshInterval() default "1s";//刷新间隔
   String indexStoreType() default "fs";//索引文件存储类型
}

@Field

加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。
通过@Field注解来进行详细的指定,如果没有特殊需求,那么只需要添加@Document即可。
@Field注解的定义如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Field {

   FieldType type() default FieldType.Auto;#自动检测属性的类型
   FieldIndex index() default FieldIndex.analyzed;#默认情况下分词
   DateFormat format() default DateFormat.none;
   String pattern() default "";
   boolean store() default false;#默认情况下不存储原文
   String searchAnalyzer() default "";#指定字段搜索时使用的分词器
   String indexAnalyzer() default "";#指定字段建立索引时指定的分词器
   String[] ignoreFields() default {};#如果某个字段需要被忽略
   boolean includeInParent() default false;
}
3. ElasticsearchRepository
//不需要加@Component,直接可以@Autowared
public interface ArticleSearchRepository extends ElasticsearchRepository {
   List findByName(String name);
   //使用 Page countrys = articleSearchRepository.findByName("测试",  PageRequest.of(0, 10)); //分页是从0开始的
   Page findByName(String name, Pageable pageable); 
   Country findProductById(String name);

}

Page的方法:

getTotalElements() 匹配的总共有多少条数据
getTotalPages() 匹配的总共有多少页
getSize() 用户想在当前页获取的数量
getNumberOfElements() 当前页实际获取的数量
getPageable().getPageSize() 当前页获取的数量
getPageable().getPageNumber() 当前是多少页(从0开始,使用的时候需要+1)

示例

Country.java

@Document(indexName = "world", type = "country")
public class Country implements Serializable {

   @Id
   private Integer id;

   @Field(searchAnalyzer = "ik_max_word",analyzer = "ik_smart")
   private String name;

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public Integer getId() {
       return id;
   }

   public void setId(Integer id) {
       this.id = id;
   }
}

CountrySearchRepository.java

public interface CountrySearchRepository extends ElasticsearchRepository {
   List findCountryByName(String name);
   //使用 Page countrys = countrySearchRepository.findByName("测试",  PageRequest.of(0, 10)); //分页是从0开始的
   Page findCountryByName(String name, Pageable pageable); 
   Country findCountryById(String name);

}
SearchService.java

public class SearchService{

   @Autowared
   CountrySearchRepository countrySearchRepository;
 
   public Page getCountryByName(String name) {
       Page countrys = countrySearchRepository.findCountryByName("测试",  PageRequest.of(0, 10));
       return countrys;
   }
}

源码对应项目:springboot-Spring-data-elasticsearch
https://github.com/BambooZhang/springboot-study

参考资料

Elasticsearch 6.4基本操作 - Java版
https://www.cnblogs.com/swordfall/p/9981883.html
SpringBoot整合Elasticsearch
https://blog.csdn.net/chen_2890/article/details/83895646

https://www.cnblogs.com/swordfall/p/9981883.html

你可能感兴趣的:(#,elasticsearch,Elasticsearch)