初始ElasticSearch
学习目标
- 安装ElasticSearch
- 安装Kinbana
- 掌握ElasicSearch基础语法
- 索引操作
- 文档操作
- 查询操作
前言
在Linux中安装ES
例如:Elasticsearch本质是一个java语言开发的web项目,我们可以通过RESTful风格的接口访问该项目内部的Lucene,从而让全文搜索变得简单。
提示:以下是本篇文章正文内容,下面案例可供参考
一、安装ES
准备工作
- 准备一台搭载Centos7系统的虚拟机,并使用xshell远程连接
- 关闭防火墙,放便访问ES
- 配置最大可创建文件数大小
# 关闭防火墙
systemctl stop firewalld.service
# 禁止防火墙自启动
systemctl disable firewalld.service
# 打开系统配置文件
vim /etc/sysctl.conf
# 添加以下配置
vm.max_map_count=655360
# 使配置文件生效
sysctl -p
- 由于ES服务不能由root用户运行,此时我们需要创建一个非root用户,这里以es(用户)举例
useradd es
- 解压es压缩包并放到到/usr/local/目录下
# 解压
tar -zxvf es压缩包 -C /usr/local/
- 到这里es服务我们已经安装好了,接下来启动es服务
cd /usr/local/elasticsearch/bin/
# 前台方式运行
./elasticsearch
# 后台方式运行
./elasticsearch -d
注意事项:
ES使用JAVA语言编写的,在ES7版本之前,我们还需要配置JAVA环境变量,但在ES7版本(一次大的版本升级)之后在ES内部已经封装好了JAVA环境变量
ES不能以root用户运行,我们需要新建一个非root用户,并赋予其操作es的权限
二、安装Kibana
1.Kibana介绍
Kibana是一款开源的数据分析和可视化平台,设计用户和ElasticSearch协作
2.安装
# 解压
tar -zxvf kibana压缩包 -C /usr/local/
# 因为kibana是和es相互协作的,需要在配置文件中指定es的ip地址以及端口
cd /usr/local/kibana/config/
vim kibana.yml
# 添加以下配置
server.host:"kibana主机ip"
elasticsearch.hosts:["elasticsearch主机ip"]
注意事项:
Kibana和es相同,都不能以root用户运行,我们需要新建一个非root用户,并赋予其操作kibana的权限
三、kibana客户端
- 出现以下页面说明es以及kibana服务启动成功
四、ElasticSearch索引操作
- ElasticSearch是一个全文检索服务器,用于搜索非结构化数据
- 那什么是结构化数据,什么是非结构化数据呢?
- 结构化数据:具有固定格式和固定长度的数据,如数据库中的字段
- 非结构化数据:指格式和长度不固定的数据
- ElasticSearch是一个Restful风格的数据分析引擎
- 编码格式遵循Restful风格
创建索引
- 创建student索引
- 索引相当于数据库中的table
PUT /student
{
"mappings":{
"properties":{
"id":{
"type":"integer"
},
"name":{
"type":"text"
}
}
}
}
删除索引
- 删除student索引
DELETE /student
五、ElasticSearch文档操作
新增修改文档数据
- 新增student中id、name域的值
POST /student/_doc/1
{
"id":1.
"name":"名字"
}
注意:
POST /student/_doc/1 这个1是索引id而不是文档中中的域(id),如果不指定索引id的话id会自动生成一段字符串
根据id查询文档
GET /student/_doc/id值
根据id删除文档
DELETE /student/_doc/id值
域的属性
注意:text是带有分词的字符串,keyword是不带有分词的字符串
- index:该域是否创建索引,只有设置为true才能根据域的关键词查询文档(也就是开启了倒排索引)
- store:是否单独存储
- analyzer:使用的分词器
- ElasticSearch默认使用的分词器是standard analyzer
- 如果需要使用第三方分词器,可以使用ik以及pinyin分词器
举例:
- 创建student索引,其中的域有(id,name,info)其中name和info需要创建索引并使用ik分词器,以及单独存储
- 新增文档数据、查询单独存储的数据
PUT /student
{
"mappings": {
"properties": {
"id":{
"type":"integer",
"store": true
},
"name":{
"type":"text",
"index": true,
"store": true,
"analyzer": "ik_smart"
},
"info":{
"type": "text",
"index": true,
"store": true,
"analyzer": "ik_smart"
}
}
}
}
POST /student/_doc/1
{
"id":1,
"name":"张三",
"info":"张三正在学习ElasticSearch"
}
GET /student/_search
{
"stored_fields": ["name","info"]
}
六、分词器
- ElasticSearch默认的分词器是standard analyzer
- 该分词器会根据空格以及英文符号进行分词,会进行英文的大小写转换(对大小写不敏感)
测试:
- 该分词器会根据空格以及英文符号进行分词,会进行英文的大小写转换(对大小写不敏感)
GET /_analyzer
{
"text":"Test the text",
"analyzer":"standard"
}
ik分词器
- ik分词器根据词典进行分词,词典在ik分词器的config目录下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopwords.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
- 重启ES以及Kibana服务
- 测试ik分词器效果
# 这里analyzer也可以设置城ik_max_word
# ik_max_word比_ik_smart分的词更多更细致
GET /_analyzer
{
"text":"测试分词器",
"analyzer":"ik_smart"
}
自定义分词器
- 在真实开发中,我们可能即会进行拼音分词又会进行文字分词,此时我们需要自定义分词器
- 在创建索引的时候自定义分词器
PUT /student
{
"settings": {
"analysis": {
"analyzer": {
"ik_pinyin":{
"tokenizer":"ik_max_word",
"filter":"pinyin_filter"
}
},
"filter": {
"pinyin_filter":{
"type":"pinyin",
"keep_separate_first_letter" : false,
"keep_full_pinyin" : true,
"keep_original" : true,
"remove_duplicated_term" : true
}
}
}
},
"mappings": {
"properties": {
"name":{
"type":"text",
"index": true,
"analyzer": "ik_pinyin"
},
"age":{
"type":"integer"
}
}
}
}
# 测试自定义分词器
GET /student/_analyzer
{
"text":"你好自定义分词器",
"analyzer":"自定义分词器名"
}
温馨提示:
自定义分词详细属性请浏览Githup官网
https://github.com/medcl/elasticsearch-analysis-pinyin
七、文档查询
查询所有域
- 到这里大家对`ElasticSearch`已经有一定的了解了,这个student(索引),match_all(搜索方式),学过mysql的小伙伴应该知道这个相当于mysql中的`select * from student`
GET /student/_search
{
"query":{
"match_all":{}
}
}
全文检索match
- 这里以student中的info字段举例
GET /student/_search
{
"query":{
"match":{
"info":"初始全文检索"
}
}
}
注:在搜索时,关键字可能会输入错误,ES提供了自动纠错的功能
范围搜索
- 这里以student中的id举例
- 相当于sql语句中的
SELECT * FROM student WHEREid >= 1 and id <= 5
- 相当于sql语句中的
GET /student/_search
{
"query":{
"id":{
"gte":1,
"lte":5
}
}
}
温馨提示:
这个range只能对数字类型的字段进行范围搜索
match_phrase
短语检索,搜索条件不进行任何分词解析
温馨提示:
match_phrase
与ma在这里插入代码片match
不同的是,match
会对搜索条件进行分词解析(standard analyzer/ik_smart/ik_max_word/pinyin/自定义分词)
- 这里以student中的info举例
GET /student/_search
{
"query":{
"match_phrase":{
"info":"短语检索"
}
}
}
term/term
单词/词组搜索,搜索条件不做任何分词解析- 这里以student中的info字段举例
# 单词搜索
GET /student/_search
{
"term":{
"info":"单词搜索"
}
}
# 词组搜索
GET /student/_search
{
"terms":{
"info":["词组","搜索"]
}
}
总结
- 以上就是今天要讲的内容,本文仅仅简单介绍了ElaticSearch的使用,而通过ElasticSearch我们可以实站全栈搜索,分析日志等功能。
- 总之ElasticSearch是一个功能强大的搜索和分析引擎,可以帮助用户快速的存储,搜索和分析大规模的数据,ElasticSearch具有高可拓展性、高可用性、高性能和易用性等优点