下载elasticsearch安装包
直接github下载安装包,本次下载的版本elasticsearch-6.8.22.tar.gz
链接
添加用户
添加用户的原因:后面启动ES的时候,无法使用root帐号,所以需要添加其他帐号
添加帐号
useradd es
修改密码
passwd es
修改 /etc/sudoers
root ALL=(ALL) ALL(这行下添加下面一行)
es ALL=(ALL) ALL
安装JDK1.8
直接使用es帐号安装jdk,root帐号执行su es切换到es帐号。(使用root帐号配置,es帐号执行java -version发现找不到命令,因为es帐号没有jdk目录的权限)
在网上找个jdk1.8上传服务器,配置jdk环境变量
编辑此文件加入下面三行JAVA_HOME目录指向你的jdk目录,
vi /etc/profile
编辑完成,重新加载配置
source /etc/profile
export JAVA_HOME=/root/jdk1.8.0_271
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib
安装elasticsearch
直接使用es帐号安装ES(可以使用root帐号su es命令切换到es帐号)
上传elasticsearch-6.8.22.tar.gz至服务器,并且cd到安装目录
进行解压
tar -zxvf elasticsearch-6.8.22.tar.gz
修改解压后的目录为es
mv elasticsearch-6.8.22 elasticsearch
修改ES配置文件
/root/es/elasticsearch/config目录下的jvm.options,将堆内存修改成合适的,
修改/root/es/elasticsearch/config目录下的elasticsearch.yml
修改或者添加下面配置
#集群名称
cluster.name: chenke-es
#节点名称,每次节点必须设置成不一样
node.name: node-1
#是否能进行主节点选举
node.master: true
#本节点是否存储数据
node.data: true
#数据持久化目录,根据自己挂载空间设置
path.data: /root/es/data
#日志目录,根据自己挂载空间设置
path.logs: /root/es/logs
#是否使用物理内存
bootstrap.memory_lock: true
#本机IP,如果是单IP可以设置成0.0.0.0
network.host: 192.168.38.128
#对外rest接口端口
http.port: 9200
#内部节点通信端口
transport.tcp.port: 9300
#配置集群IP,因为我用的一台服务器部署三个节点,所以需要通过设置http.port,transport.tcp.port端口参数达到目的
#192.168.38.128:9300等于 集群节点IP:transport.tcp.port(参数)
#如果你用多台服务器transport.tcp.port这个参数都可以设置成9300,http.port设置成9200
discovery.zen.ping.unicast.hosts: ["192.168.38.128:9300","192.168.38.128:9301","192.168.38.128:9302"]
#主节点必须最少几个,少于这个数,集群就会挂了。一般是:节点数/2+1,我现在用三个节点所以设置成2
discovery.zen.minimum_master_nodes: 2
集群其他节点服务器先安装jdk,将上面配置完成的ES目录下载到本地。
然后修改/root/es/elasticsearch/config目录下的elasticsearch.yml
只需要修改下面几个配置即可
#节点名称,每次节点必须设置成不一样
node.name: node-1
#本机IP,如果是单IP可以设置成0.0.0.0
network.host: 192.168.38.128
每个节点服务器将9200和9300端口放开,节点之间需要通讯需要服务器之间9300端口互通
firewall-cmd --permanent --zone=public --add-port=9200/tcp && firewall-cmd --reload
firewall-cmd --permanent --zone=public --add-port=9300/tcp && firewall-cmd --reload
每个节点服务器修改/etc/security/limits.conf配置文件,最后面增加下面几行,否则启动ES会报错
* soft nproc 819200
* hard nproc 819200
* soft nofile 819200
* hard nofile 819200
* hard memlock unlimited
* soft memlock unlimited
修改完成后,reboot重启服务器即可。
安装IK分词插件
插件地址,注意版本对照关系,版本不对应会启动报错
因为我装的ES是6.x版本,所以下载的是6.8.22,将elasticsearch-analysis-ik-6.8.22.zip放在/root/es/elasticsearch/plugins目录解压即可
使用前面加的es帐号启动每个节点ES,直接用root帐号启动会报错
进入/root/es/elasticsearch/bin目录
#非后台启动(不能关窗口),第一次启动可以使用此,方便看启动错误
./elasticsearch
#后台启动
./elasticsearch -d
全部启动完成之后,可以使用http://IP:9200进行访问,如果能访问通说明集群搭建成功了
安装ES可视化界面
下载插件
谷歌浏览器访问chrome://extensions/
加载程序选择,下载的插件目录即可。
打开安装的插件,连接之后,显示所有节点
使用Kibana查询
官方下载地址,下载对应版本。因为只是测试,图方便就下载了windos版本。
解压完只需要修改,下图的配置,对应好自己安装的es。然后进去bin目录启动kibana.bat即可
文档地址,已经上传到gitee上,建议先把基本语法格式,再去学习spring-boot-starter-data-elasticsearch自定义查询使用会发现格式类似,学习起来容易上手
spring-boot-starter-data-elasticsearch使用
个人也在熟悉过程中,直接上代码,代码仓库链接
引入坐标,需要和ES版本对应,否则会有各种问题
而且spring-boot-starter-data-elasticsearch3.X版本和spring-boot-starter-data-elasticsearch4.X版本存在一些比较大差异,可能是由于elasticsearch6.x和7.x差异比较大导致。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
YML配置
elasticsearch:
rest:
connection-timeout: 10
read-timeout: 60
uris:
- http://192.168.38.128:9200
- http://192.168.38.128:9201
- http://192.168.38.128:9202
新建索引库和操作索引数据需要先新建VO与之对应,为测试尽量会完善所有字段类型和分词
/**
* 各种字段类型
*
* @author chenke
* @version 1.0
* @date 2022/5/30 20:47
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "chenkeindex", shards = 1, replicas = 1)
public class ChenkeIndex {
@Id
@Field(type = FieldType.Long)
private Long blogId;
/**
* Text可以分词analyzer = "ik_smart"
*/
@Field(type = FieldType.Text)
private String content;
@Field(type = FieldType.Integer)
private int status;
/**
* Keyword不分词的
*/
@Field(type = FieldType.Keyword)
private String type;
@Field(type = FieldType.Double)
private Double price;
/**
* index = false不需要被索引
*/
@Field(type = FieldType.Keyword, index = false)
private String images;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss.SSS")
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss.SSS")
private Date createTime;
}
创建索引方法,注释的为spring-boot-starter-data-elasticsearch4.X版本对应的
@Autowired
private ElasticsearchRestTemplate esTemplate;
@Autowired
private EsChenkeIndex esChenkeIndex;
/**
* 创建索引
*/
@Test
public void createIndex() {
esTemplate.deleteIndex(ChenkeIndex.class);
esTemplate.createIndex(ChenkeIndex.class);
esTemplate.putMapping(ChenkeIndex.class);
// ES的版本是elasticsearch-6.8.22,
// 引用spring-data-elasticsearch 4.x以上版本发现无法创建createMapping,只好还原用3.2.3.RELEASE版本
//IndexOperations indexOperations = esTemplate.indexOps(ChenkeIndex.class);
//// indexOperations.delete();
//indexOperations.createMapping(ChenkeIndex.class);
//indexOperations.create();
}
新增索引数据,更新和保存都是对应此方法,ID相同则会更新
/**
* 新增数据
*/
@Test
public void addIndexData() {
List<ChenkeIndex> list = new ArrayList<>();
for (int i = 1; i < 11; i++) {
ChenkeIndex data = ChenkeIndex.builder()
.blogId((long) i)
.content("测试数据" + i)
.status(i)
.type("类型" + i)
.price((double) i)
.images("http://www.aaa.com/" + i)
.createTime(new Date())
.build();
list.add(data);
esChenkeIndex.save(data);
}
// 批量插入save和saveAll,主键ID相同则是更新
// 改变第一条记录ID
list.get(0).setBlogId(50L);
esChenkeIndex.saveAll(list);
}
删除索引
/**
* 删除索引
*/
@Test
public void deleteIndexData() {
esChenkeIndex.deleteById(1L);
}
常用基础查询,需要注意方法命名,要遵循类似jpa写法,参考地址
/**
* 基础查询
*/
@Test
public void baseQuery() {
// 根据ID查询
Optional<ChenkeIndex> byId = esChenkeIndex.findById(50L);
byId.ifPresent(System.out::println);
// 自定义方法查询
// 方法名称需要按照规定格式才可以。文档提了很多列子,参考即可
// 参考地址https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.query-methods.criterions
// =单个字段值
List<ChenkeIndex> byStatus = esChenkeIndex.findByStatus(1);
System.out.println(byStatus);
// not单个字段
List<ChenkeIndex> byStatus2 = esChenkeIndex.findByStatusNot(1);
System.out.println(byStatus2);
// 按时间查范围
List<ChenkeIndex> byStatus3 = esChenkeIndex.findByCreateTimeBetween("2021-05-31 13:18:59.262", "2023-05-31 13:18:59.262");
System.out.println(byStatus3);
}
自定义查询,这块是重点,本人也在学习过程中,会慢慢完善这块
/**
* 自定义查询
*/
@Test
public void customQuery() {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
NativeSearchQuery query = queryBuilder
.withQuery(QueryBuilders.multiMatchQuery("测试数据", "content"))
// 分页
.withPageable(PageRequest.of(0, 5))
// 根据查询结果按时间升序
.withSort(SortBuilders.fieldSort("createTime").order(SortOrder.ASC)).build();
AggregatedPage<ChenkeIndex> chenkeIndices = esTemplate.queryForPage(query, ChenkeIndex.class);
// 当前页数据
List<ChenkeIndex> content = chenkeIndices.getContent();
// 总页数
int totalPages = chenkeIndices.getTotalPages();
// 总条数
long totalElements = chenkeIndices.getTotalElements();
System.out.println(totalPages);
System.out.println(content);
// 自定义查询最常用,还需要详细测试完善
}