Elasticsearch Java API有四类client连接方式
其中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作为参考
未完待续…
官方文档: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对应的版本
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.0.2.RELEASE
org.springframework.boot
spring-boot-starter-data-elasticsearch
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注解里面的几个属性,类比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";//索引文件存储类型
}
加上了@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