1.安装jdk1.8
yum install java-1.8.0-openjdk* -y
2. 安装ElasticSearch
创建es用户
groupadd esgroup
useradd -g esgroup es
passwd es
cd /usr/local/src/es
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.0.tar.gz
tar -xvzf elasticsearch-6.6.0.tar.gz
mv ./elasticsearch-6.6.0 ./6.6.0
chown -R es:esgroup ./6.6.0
修改配置参数
vim /usr/local/src/es/6.6.0/config/elasticsearch.yml
# 网络设置
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
3. 启动
启动
su es
cd /usr/local/src/es
./bin/elasticsearch #调试没有问题后在后台启动
./bin/elasticsearch -d #后台启动
4 脚本启动
#!/bin/sh
#chkconfig: 2345 80 05
#description: elasticsearch
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64
export JAVA_BIN=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
case "$1" in
start)
su es<<!
cd /usr/local/src/es/6.6.0/
./bin/elasticsearch -d
!
echo "elasticsearch startup"
;;
stop)
es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`
kill -9 $es_pid
echo "elasticsearch stopped"
;;
restart)
es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`
kill -9 $es_pid
echo "elasticsearch stopped"
su es<<!
cd /usr/local/src/es/6.6.0/
./bin/elasticsearch -d
!
echo "elasticsearch startup"
;;
*)
echo "start|stop|restart"
;;
esac
exit $?
脚本中的各种路径需要根据自己服务器修改。
为启动脚本增加执行权限:chmod +x /etc/init.d/elastisearch
配置开机启动es:chkconfig --add elasticsearch
重启机器:reboot
检查ES是否启动:jps 查看是否有 Elasticsearch 服务
常见问题
java.lang.RuntimeException: can not run elasticsearch as root 不能使用root用户启动
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] 每个进程最大同时打开文件数太小,可通过下面2个命令查看当前数量
ulimit -Hn
ulimit -n
解决
ulimit -Hn 65536
ulimit -n 65536
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解决:
切换到root用户
执行命令:
sysctl -w vm.max_map_count=262144
查看结果:
sysctl -a|grep vm.max_map_count
显示:
vm.max_map_count = 262144
上述方法修改之后,如果重启虚拟机将失效,所以:
解决办法:
在 /etc/sysctl.conf文件最后添加一行
vm.max_map_count=262144
保存后执行
sysctl -p
即可永久修改
4.安装es可视化管理工具 elasticsearch-head
安装node.js
https://blog.csdn.net/Y_vocefenrir/article/details/105296295
下载elasticsearch-head
https://codeload.github.com/mobz/elasticsearch-head/zip/master
修改Gruntfile.js文件:
connect: {
server: {
options: {
hostname: '*' ,
port: 9100,
base: '.',
keepalive: true
}
}
}
执行 npm install ,npm run start
填写真实的es地址,点击连接,这里可能出现跨域问题所以要修改es的配置文件elasticsearch.yml
vim ./es地址/config/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
5 springboot集成ElasticsearchRepository
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
添加配置
spring:
data:
elasticsearch:
cluster-nodes: 192.168.137.129:9300
repositories:
enabled: true
创建ApiLog
package com.example.demo;
/**
* Author : 尤毅鹤
* Date: 2020/04/07 15:19
* Description: <描述>
*/
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "apilog_index", type = "apilog")
public class ApiLog {
private static final long serialVersionUID = -382318121710813866L;
@Id
private long id;
private int uid;
private int app_id;
private String url;
private long c_time;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public int getApp_id() {
return app_id;
}
public void setApp_id(int app_id) {
this.app_id = app_id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public long getC_time() {
return c_time;
}
public void setC_time(long c_time) {
this.c_time = c_time;
}
public ApiLog() {
}
public ApiLog(long id, int uid, int app_id, String url, long c_time) {
this.id = id;
this.uid = uid;
this.app_id = app_id;
this.url = url;
this.c_time = c_time;
}
@Override
public String toString() {
return "ApiLog{" +
"id=" + id +
", uid=" + uid +
", app_id=" + app_id +
", url='" + url + '\'' +
", c_time=" + c_time +
'}';
}
}
ApiLogService
package com.example.demo;
import java.util.ArrayList;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ApiLogService {
@Autowired
private ApiLogSearchRepository repository;
/**
* 删除文档
* @param id
* @return
*/
public boolean deleteApiLog(Long id) {
try {
repository.deleteById(id);
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
return true;
}
/**
* 插入文档
* @param aLog
* @return
*/
public ApiLog saveApiLog(ApiLog aLog) {
ApiLog apiLog = new ApiLog();
try {
apiLog = repository.save(aLog);
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
return apiLog;
}
/**
* 按id查询
* @param id
* @return
*/
public ApiLog findOneApiLog(long id) {
ApiLog apiLog = new ApiLog();
try {
apiLog = repository.findById(id).get();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
return apiLog;
}
/**
* 查询全部文档
* @return
*/
public List<ApiLog> findAllApiLog() {
List<ApiLog> list = new ArrayList<>();
try {
Iterable<ApiLog> aIterable = repository.findAll();
for (ApiLog apiLog : aIterable) {
list.add(apiLog);
}
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
return list;
}
/**
* 按条件过滤查询
* @param b_time
* @param e_time
* @return
*/
public List<ApiLog> findApiLogByDate(String b_time,String e_time) {
List<ApiLog> list = new ArrayList<>();
try {
// 单个字符串
// QueryBuilder qb0 = QueryBuilders.termQuery("id", "0");
// 闭区间
QueryBuilder qb1 = QueryBuilders.rangeQuery("c_time").from(b_time).to(e_time);
// 大于
QueryBuilder qb2 = QueryBuilders.rangeQuery("uid").gt(0);
// 过滤多条件
QueryBuilder qb = QueryBuilders.boolQuery().must(qb1).must(qb2);
Iterable<ApiLog> aIterable = repository.search(qb);
for (ApiLog apiLog : aIterable) {
list.add(apiLog);
}
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
return list;
}
}
ApiLogSearchRepository
package com.example.demo;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface ApiLogSearchRepository extends ElasticsearchRepository<ApiLog, Long>{
}
测试
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
class DemoApplicationTests {
@Autowired
ApiLogController apiLogController;
@Test
void contextLoads() {
ApiLog apiLog = apiLogController.saveApiLog(new ApiLog(System.currentTimeMillis(), 10, 30, "http://www.baidu.com", System.currentTimeMillis()));
System.out.println(apiLog);
}
}
查看