一、安装elasticsearch
1.到官网下载安装包https://www.elastic.co/,这里下载的是7.4版本
2.创建一个安装目录
mkdir /usr/local/es
3.将elasticsearch-7.4.0-linux-x86_64.tar.gz解压到/usr/local/es 目录下
tar -zxvf elasticsearch-7.4.0-linux-x86_64.tar.gz -C /usr/local/es
4.因为安全问题,ElasticSearch 不允许root用户直接运行,所以要创建新用户,在root用户中创建新用户
#新增es1账户
useradd es1
#为es1账户设置密码
passwd es1
5.为用户授权
chown -R es1:es1 /usr/local/es/elasticsearch-7.4.0
6. 修改config目录下elasticsearch.yml文件
vi /usr/local/es/elasticsearch-7.4.0/config/elasticsearch.yml
修改以下内容
cluster.name: my-application
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
cluster.name:配置elasticsearch的集群名称,默认是elasticsearch。
node.name:节点名,elasticsearch会默认随机指定一个名字,方便管理
network.host:设置为0.0.0.0允许外网访问
http.port:Elasticsearch的http访问端口
cluster.initial_master_nodes:初始化新的集群时需要此配置来选举master
7.修改虚拟机的配置文件,新创建的offcn用户最大可创建文件数,最大虚拟内存太小,切换到root用户,编辑下列配置文件
切换到root用户
su root
设置最大可创建文件数太小
vi /etc/security/limits.conf
# 在文件末尾中增加下面内容
es1 soft nofile 65536
es1 hard nofile 65536
vi /etc/security/limits.d/20-nproc.conf
# 在文件末尾中增加下面内容
es1 soft nofile 65536
es1 hard nofile 65536
* hard nproc 4096
设置最大虚拟内存太小
vi /etc/sysctl.conf
# 在文件中增加下面内容
vm.max_map_count=655360
重新加载:
sysctl -p
8.启动ElasticSearch
#切换到es1 用户启动
su es1
cd /usr/local/es/elasticsearch-7.4.0/bin
#启动
./elasticsearch
新打开一个终端,关闭防火墙
systemctl stop firewalld.service
9. 打开网页访问 ip+9200端口,此时elasticsearch已成功启动
二、安装辅助工具Kibana
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索 引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。
1.官网下载安装包: https://www.elastic.co/cn/
同样下载7.4版本
2.创建安装目录
mkdir /usr/local/kibana
3.将kibana解压到安装目录
tar -zxvf kibana-7.4.0-linux-x86_64.tar.gz -C /usr/local/kibana
4. 修改kibana配置
vi /usr/local/kibana/kibana-7.4.0-linux-x86_64/config/kibana.yml
添加以下内容
server.port: 5601
server.host: "0.0.0.0"
server.name: "kibana-es1"
elasticsearch.hosts: ["http://127.0.0.1:9200"]
elasticsearch.requestTimeout: 99999
server.port:http访问端口
server.host:ip地址,0.0.0.0表示可远程访问
server.name:kibana服务名
elasticsearch.hosts:elasticsearch地址
elasticsearch.requestTimeout:请求elasticsearch超时时间,默认为30000,此处可根据情况设置
5.启动kibana, 由于kibana不建议使用root用户启动,如果用root启动,需要加--allow-root参数
# 切换到kibana的bin目录
cd /usr/local/kibana/kibana-7.4.0-linux-x86_64/bin
# 启动
./kibana --allow-root
6.访问kibana ip+5601端口,kibana成功启动
三、IK分词器安装
1.下载压缩包elasticsearch-analysis-ik-7.4.0.zip-Java文档类资源
2.在/usr/local/es/elasticsearch-7.4.0/plugins/下新建目录analysis-ik
cd /usr/local/es/elasticsearch-7.4.0/plugins
mkdir analysis-ik
3.将下载的压缩包 复制到 analysis-ik目录下解压
由于这里是zip包不是gz包,所以我们需要使用unzip命令进行解压,如果本机环境没有安装unzip,需安装:
yum install zip
yum install unzip
#执行解压
unzip /usr/local/es/elasticsearch-7.4.0/plugins/analysis-ik/elasticsearch-analysis-ik-7.4.0.zip
4.将elasticsearch-analysis-ik-7.4.0目录下的config目录中的所有文件 拷贝到elasticsearch的config目录
cp -R /usr/local/es/elasticsearch-7.4.0/plugins/analysis-ik/config/* /usr/local/es/elasticsearch-7.4.0/config
5.配置成功之后,重新启动ES,重新启动Kibana,使用IK分词器。
四、测试
测试使用kibana工具 访问ip+5601端口,点击右边导航栏的扳手图标
1.创建索引
2.查询索引
3.删除索引
4.创建索引并添加映射
5.查询映射
6.添加字段
7.添加文档,指定id
8.查询所有文档
9.删除指定id文档
10.使用IK分词器查询文档
(1)创建索引,添加映射,并指定分词器为ik分词器
PUT person
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"address": {
"type": "text",
"analyzer": "ik_max_word"
},
"age":{
"type":"integer"
}
}
}
}
(2)添加文档
POST /person/_doc/1
{
"name":"张三",
"age":18,
"address":"北京海淀区"
}
POST /person/_doc/2
{
"name":"李四",
"age":18,
"address":"北京朝阳区"
}
POST /person/_doc/3
{
"name":"王五",
"age":18,
"address":"北京昌平区"
}
POST /person/_doc/4
{
"name":"马六",
"age":18,
"address":"昌平区慧聪园"
}
(3)查询映射
(4)查看分词效果
(5)词条查询:term ,查询person中匹配到"北京"两字的词条
(6)全文查询:match, 全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集
五、Java使用easy-es对索引以及文档进行操作,官网地址:Easy-Es
1.引入相关依赖,并排除springboot中的es依赖
<dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.dromara.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>2.0.0-beta4</version>
</dependency>
2.添加配置
easy-es:
address : 127.0.0.1:9200 # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开
username: es1 #如果无账号密码则可不配置此行
password: es1#如果无账号密码则可不配置此行
3.创建索引实体类
@Data
@ApiModel(value = "User", description = "用户")
@IndexName(value = "user", shardsNum = 3, replicasNum = 2) // 可指定分片数,副本数,若缺省则默认均为1
public class User {
/**
* id
*/
@IndexId(type = IdType.CUSTOMIZE)
@ApiModelProperty(value = "id", example = "1")
private Integer id;
@ApiModelProperty(value = "高亮内容")
private String lightName;
/**
* 名字
*/
@IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)
@HighLight(mappingField = "lightName")
@ApiModelProperty(value = "名字", example = "张天")
private String name;
/**
* 年龄
*/
@ApiModelProperty(value = "年龄", example = "25")
@IndexField(fieldType = FieldType.INTEGER)
private Integer age;
/**
* 家庭地址
*/
@ApiModelProperty(value = "家庭地址", example = "四川省成都市金牛区")
@IndexField(fieldType = FieldType.TEXT)
private String address;
@IndexField(fieldType = FieldType.GEO_POINT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)
@ApiModelProperty(value = "地理位置经纬度坐标", example = "40.13933715136454,116.63441990026217")
private String location;
/**
* 学校
*/
@ApiModelProperty(value = "学校", example = "北京大学")
@IndexField
private String school;
/**
* 手机号码
*/
@ApiModelProperty(value = "手机号码", example = "18381197452")
@IndexField(fieldType = FieldType.TEXT)
private String phone;
}
4.创建一个es的mapper
@Component
public interface MyUserMapper extends BaseEsMapper<User> {
}
5.创建搜索请求实体
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "QueryUserDTO", description = "es搜索用户请求实体")
public class QueryUserDTO {
/**
* id
*/
@ApiModelProperty(value = "id", example = "1")
private Integer id;
/**
* 名字
*/
@ApiModelProperty(value = "名字", example = "张天")
private String name;
/**
* 家庭地址
*/
@ApiModelProperty(value = "家庭地址", example = "四川省成都市金牛区白草路")
private String address;
/**
* 学校
*/
@ApiModelProperty(value = "学校", example = "成都东软学院")
private String school;
/**
* 手机号码
*/
@ApiModelProperty(value = "手机号码", example = "18381197452")
private String phone;
@ApiModelProperty(value = "当前页", example = "1")
private Integer pageNum;
@ApiModelProperty(value = "每页条数", example = "10")
private Integer pageSize;
}
6.创建测试controller
@RestController
@Api(tags = "es")
public class TestUseEeController {
@Resource
private MyUserMapper userMapper;
@GetMapping("/createIndex")
@Anonymous
@ApiOperation(value = "创建es索引", notes = "创建es索引")
public ResponseVO<Boolean> createIndex() {
return ResponseVO.success(userMapper.createIndex());
}
@GetMapping("/deleteIndex")
@Anonymous
@ApiOperation(value = "删除es索引", notes = "删除es索引")
public ResponseVO<Boolean> deleteIndex() {
return ResponseVO.success(userMapper.deleteIndex("user"));
}
@PostMapping("/insert")
@Anonymous
@ApiOperation(value = "插入数据", notes = "插入数据")
@ApiImplicitParams({
@ApiImplicitParam(name = "user", value = "用户数据", paramType = "body", dataType = "User", dataTypeClass = User.class, required = true)
})
public ResponseVO<Integer> insert(@RequestBody User user) {
userMapper.insert(user);
return ResponseVO.success(1);
}
@GetMapping("/delete")
@Anonymous
@ApiOperation(value = "删除数据", notes = "删除数据")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "id", paramType = "query", dataType = "String", required = true)
})
public ResponseVO<Integer> insert(String id) {
return ResponseVO.success(userMapper.deleteById(id));
}
@PostMapping("/search")
@Anonymous
@ApiOperation(value = "搜索数据", notes = "搜索数据")
@ApiImplicitParams({
@ApiImplicitParam(name = "dto", value = "搜索请求实体", paramType = "body", dataType = "QueryUserDTO", dataTypeClass = QueryUserDTO.class, required = true)
})
public ResponseVO<EsPageInfo<User>> search(QueryUserDTO dto) {
LambdaEsQueryWrapper<User> wrapper = new LambdaEsQueryWrapper<>();
//排序 年龄降序
wrapper.orderByAsc(User::getAge);
//查询 姓名
wrapper.like(User::getName, dto.getName());
//返回值
return ResponseVO.success(userMapper.pageQuery(wrapper, dto.getPageNum(), dto.getPageSize()));
}
}
7.添加启动类注解@EsMapperScan,扫描MyUserMapper 类所在的包
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@MapperScan("com.it.test.mapper")
@Slf4j
@EsMapperScan("com.it.test.esmapper")
public class SpringbootTestApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApplication.class, args);
}