本文只写增删改,关于查询有点复杂,会在另一篇文章详细概述
springboot是个好东西,啧啧
首先引入依赖
<!-- elasticsearch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
然后再造个实体类
package com.study.elasticsearch;
import java.io.Serializable;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "data", type = "table")
//indexName索引名称 可以理解为数据库名 必须为小写 不然会报org.elasticsearch.indices.InvalidIndexNameException异常
//type类型 可以理解为表名
public class Domain implements Serializable {
private static final long serialVersionUID = 1L;
@Id // 主键,注意这个搜索是id类型是string,与我们常用的不同
private String id; // @Id注解加上后,在Elasticsearch里相应于该列就是主键了,在查询时就可以直接用主键查询
private String title;
private String createTime;
private String text;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
/**
*
* @param id
* @param title
* @param createTime
* @param text
*/
public Domain(String id, String title, String createTime, String text) {
super();
this.id = id;
this.title = title;
this.createTime = createTime;
this.text = text;
}
//不写构造函数查询会报错
Domain() {
}
}
这里说下实体类上的几个注解
@Document注解里面的几个属性,类比mysql的话是这样:
indexName –> 索引库的名称,建议以项目的名称命名,就相当于数据库DB
type –> 类型,建议以实体的名称命名Table ,就相当于数据库中的表table
Document –> row 就相当于某一个具体对象
String indexName();//索引库的名称,建议以项目的名称命名
String type() default "";//类型,建议以实体的名称命名
short shards() default 5;//默认分区数
short replicas() default 1;//每个分区默认的备份数
String refreshInterval() default "1s";//刷新间隔
String indexStoreType() default "fs";//索引文件存储类型
@Id注解
在Elasticsearch里相应于该列就是主键了,在查询时就可以直接用主键查询
@Field注解
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;
}
配置文件
#es的默认名称,如果安装es时没有做特殊的操作名字都是此名称,分布式多节点用逗号分隔
spring.data.elasticsearch.cluster-name=elasticsearch
# Elasticsearch 集群节点服务地址,用逗号分隔,如果没有指定其他就启动一个客户端节点,默认java访问端口9300
spring.data.elasticsearch.cluster-nodes=localhost:9300
# 设置连接超时时间
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s
springboot 为ES封装了一套jpa的操作
package com.study.elasticsearch;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface EsRepository extends ElasticsearchRepository<Domain,String> {
}
下面就是spring一贯作风了,jpa调用
package com.study.elasticsearch;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.study.utils.Date;
@RestController
public class EsController {
@Autowired
private EsRepository esRepository;
//新增
@GetMapping("save")
public Domain save(String txt) {
Domain Info = new Domain(Date.getDateyyyyMMdd(), "testTitle", Date.getDateyyyy_MM_dd(), txt);
Domain save = esRepository.save(Info);
return save;
}
//根据id删除
@GetMapping("delete")
public String delete(String id) {
esRepository.deleteById(id);
return "success";
}
//这其实就是个新增,只不过同一个id会覆盖
@GetMapping("update")
public Domain update(String id, String txt) {
Domain Info = new Domain(id, "NewTestTitle", Date.getDateyyyy_MM_dd(), txt);
Domain save = esRepository.save(Info);
return save;
}
}
启动ES,然后再浏览器get访问,增加数据