ElasticSearch Linux版安装
安装JDK环境
执行如下命令:
安装JDK并查看JDK版本
$ yum install java-1.8.0-openjdk.x86_64
$ java -version
安装ES7版本程序包
执行如下命令,下载程序包到当前路径下:
$ curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.0-linux-x86_64.tar.gz
解压压缩包:
$ tar -zxvf elasticsearch-7.12.0-linux-x86_64.tar.gz
安装vim编辑器:
$ yum install -y vim
编辑ElasticSearch配置项
进入elasticsearch程序包(本人将elasticsearch程序包移动至/opt/es/文件夹下)
编辑config/elasticsearch.yml文件,增加如下配置:
# ES集群名称
cluster.name: my-application
# 当前节点名称
node.name: node-1
# es7保存数据路径
path.data: /opt/es/data
# es7程序日志路径
path.logs: /opt/es/logs
# 是否开启内存锁 测试环境可不开启
bootstrap.memory_lock: false
# http接口绑定的IP,0.0.0.0表示绑定任何IP
network.host: 0.0.0.0
# http开放接口
http.port: 9200
# 发现主机名称,即ES服务所在的服务器主机名称
discovery.seed_hosts: ["hostname"]
# 集群初始化主节点的名称
cluster.initial_master_nodes: ["node-1"]
# TCP接口绑定的IP
transport.host: 0.0.0.0
# TCP接口
transport.tcp.port: 9300
编辑config/jvm.options文件,更改如下配置,设置ES堆大小:
-Xmx3g
-Xms3g
编辑bin/elasticsearch文件,在文件开头增加如下配置,即设置JAVA变量
export JAVA=/usr/bin/java
编辑Linux 服务器配置
编辑/etc/security/limits.conf文件,并添加如下配置
* soft nofile 65536
* hard nofile 65536
elasticsearch - nofile 65535
* soft memlock 65535
* hard memlock 65535
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
设置单独ElasticSearch用户
执行如下命令:
# 增加elasticsearch用户
$ useradd elasticsearch
# 设置elasticsearch密码
$ passwd elasticsearch
将elasticsearch程序包、数据文件夹以及日志文件夹设置为elasticsearch用户,只有elasticsearch用户才能启动elasticsearch服务
$ chown -R elasticsearch:elasticsearch /opt/es/elasticsearch-7.12.0/
$ chown -R elasticsearch:elasticsearch /opt/es/data
$ chown -R elasticsearch:elasticsearch /opt/es/logs
设置Linux服务器的限制参数
$ ulimit -n 65535
编辑/etc/sysctl.conf文件
$ vim /etc/sysctl.conf
增加如下配置:
vm.max_map_count = 262144
保存退出之后,执行如下命令重载文件:
$ sysctl -p
开放防火墙端口白名单9200(http)以及9300(tcp),如果不想开通,则直接关闭防火墙即可:
$ systemctl stop firewalld
启动ElasticSearch服务
进入ElasticSearch程序包,执行启动命令:
$ sh ./bin/elasticsearch
查看日志:
$ tail -f /opt/es/logs/my-application.log
查看服务启动成功,执行如下命令,如果有ES信息结果返回则服务启动成功:
$ curl -i http://192.168.26.128:9200/
Elasticsearch常用命令
ElasticSearch官方文档地址:Elasticsearch Guide [7.17] | Elastic
监控ES7
查看当前版本可用命令:
GET http://192.168.26.128:9200/_cat/
索引
查看所有索引命令(v表示增加表格表头信息):
GET http://192.168.26.128:9200/_cat/indices?v
或者使用如下命令(format=json表示转成JSON格式,pretty将JSON数据格式化):
GET http://192.168.26.128:9200/_cat/indices?format=json&pretty
查看指定(blog)索引信息:
GET http://192.168.26.128:9200/_cat/indices?format=json&pretty&index=blog
新增索引:
PUT http://192.168.26.128:9200/test
{
"settings": { # 索引设置
"number_of_replicas": 1, #副本数
"number_of_shards": 1 #分片数
},
"mappings": { # 设置mapping映射
"properties": { # 设置属性值
"name":{
"type": "keyword"
},
"phone":{
"type": "keyword"
},
"age":{
"type": "integer"
},
"ip":{
"type": "ip"
},
"dec":{
"type": "text"
},
"birth":{
"type": "date"
}
}
}
}
删除索引:
DELETE http://192.168.26.128:9200/test
查看指定索引的mappings映射 (pretty表示格式化JSON数据)
GET http://192.168.26.128:9200/test/_mappings?pretty
更新指定索引mappings映射:
PUT http://192.168.26.128:9200/blog/_mappings
{
"properties": {
"create_user": {
"type": "text",
"index": false
}
}
}
文档
新增文档信息:
格式:http://ip:port/index/_doc/{id}
id表示文档数据唯一ID信息,可不填则使用默认ID
如果反复新增数据,则为更新。
POST http://192.168.26.128:9200/blog/_doc/1
{
"tags": "标签33332",
"age": "35",
"birthdate": "2023-01-02 11:32:42"
}
响应数据:
{
"_index": "blog",
"_type": "_doc",
"_id": "1", # 文档数据唯一ID
"_version": 1,
"result": "created", # 结果状态 created为新增,update为更新
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 2
}
查看所有(即默认分页查询数据from=0&size=10):
GET http://192.168.26.128:9200/blog/_search?pretty
分页查询:
格式:http://ip:port/index/_search?from={from}&size={size}&pretty
from:从第几条数据开始
size:查询指定数量数据
GET http://192.168.26.128:9200/blog/_search?from=2&size=2&pretty
SpringBoot集成ElasticSearch使用
Spring Data ElasticSearch官方文档:Spring Data Elasticsearch - Reference Documentation
搭建项目
引入依赖
引入SpringBoot Maven依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
引入Spring Boot Data ElasticSearch依赖:
使用Spring Data操作ES数据库
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
在配置文件中配置ES配置项(当前使用的是SpringBoot 2.7.10版本,老版本配置项可能有些不一致,按照指定版本来):
spring.elasticsearch.uris=http://192.168.26.128:9200
配置索引实体类
// Lombok 注解
@Data
// ES 注解,标记类为指定索引映射类
@Document(indexName = "blog")
public class Blog {
// 索引映射唯一ID值
@Id
private String id;
// mapping映射字段,type为ES7中mapping属性的type值
@Field(type = FieldType.Keyword)
private String tags;
@Field(type = FieldType.Integer)
private Integer age;
@Field(type = FieldType.Date)
private String birthdate;
@Field(type = FieldType.Text)
private String create_user;
}
配置实体操作类
ElasticsearchRepository接口为Spring Data自带的接口;
第一个泛型为索引实体类对应;
第二个泛型为索引唯一ID类型。
public interface BlogRepository extends ElasticsearchRepository<Blog, String> {}
获取索引所有数据
@Component
public class ESInitialize implements CommandLineRunner {
@Resource
private BlogRepository blogRepository;
@Override
public void run(String... args) throws Exception {
System.out.println("=======查询所有=====");
Iterable<Blog> all = blogRepository.findAll();
print(all);
// 分页查询
System.out.println("=======分页查询=====");
PageRequest of = PageRequest.of(0, 5);
Page<Blog> pageAll = blogRepository.findAll(of);
print(pageAll);
// 分页排序
System.out.println("=======分页排序=====");
// 按照age字段从小到大排序
Sort sort = Sort.by(new Sort.Order(Sort.Direction.ASC, "age"));
PageRequest pageRequest = PageRequest.of(0, 10, sort);
Page<Blog> all1 = blogRepository.findAll(pageRequest);
print(all1);
}
private void print(Iterable<Blog> data) {
int count = 0;
Iterator<Blog> iterator = data.iterator();
while (iterator.hasNext()) {
Blog next = iterator.next();
System.out.println(JSON.toJSONString(next));
count ++;
}
System.out.println("The data size is " + count);
}
}
Spring Data提供了如下查询接口:
普通增删改查接口:
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
Optional<T> findById(ID id);
boolean existsById(ID id);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> ids);
long count();
void deleteById(ID id);
void delete(T entity);
void deleteAllById(Iterable<? extends ID> ids);
void deleteAll(Iterable<? extends T> entities);
void deleteAll();
}
分页 + 排序接口:
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
派生查询
需在继承ElasticsearchRepository接口类中编写条件查询:
即通过接口名称翻译成ElasticSearch 的JSON查询数据
例如:
public interface BlogRepository extends ElasticsearchRepository<Blog, String> {
/**
* 查询 age 属性为 ages 参数的数据,
* 相当于SQL语句 select * from age in (...)
*/
Page<Blog> findAllByAgeIsIn(Pageable pageable, Integer... ages);
}
支持的关键字列表查询,见Spring Data官方表格:Spring Data Elasticsearch - Reference Documentation
注解声明式查询
需在继承ElasticsearchRepository接口类中编写条件查询:
即在接口上声明@Query注解并编写查询条件,
使用?0 ?1 ?2表示第一个参数,第二个参数以及第三个参数;
示例:
public interface BlogRepository extends ElasticsearchRepository<Blog, String> {
/**
* 相当于ES查询条件:{"query": { "fuzzy" : { "tags" : { "value": "tags" } } }
*/
@Query("{\"fuzzy\": { \"tags\" : {\"value\":\"?0\" } } }")
Page<Blog> searchLike(String tags, Pageable pageable);
}