Elasticsearch篇:Elasticsearch介绍安装及使用
目录
一、Elasticsearch介绍
# 大规模数据如何存储和检索---》elasticsearch
# Elasticsearch 是一个基于Lucene的分布式搜索和分析引擎,分布式全文检索引擎,java开发,遵循apache开源协议
使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,使得全文检索变得简单
# Elasticsearch核心概念
# Cluster:集群
ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。
# Node:节点
形成集群的每个服务器称为节点。
# Shard:分片
当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。
当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。
# Replia:副本
为提高查询吞吐量或实现高可用性,可以使用分片副本。
副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。
当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片
#全文检索
全文检索就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句
#与关系型数据库Mysql对比
mysql es
数据库 索引
表 类型
一行一行数据 文档
表中有一个个字段 字段
建表语句 映射mapping
增删查改语句 get,post,delete请求
# ELK是什么
ELK=elasticsearch+Logstash+kibana
elasticsearch:后台分布式存储以及全文检索
logstash: 日志加工、“搬运工”
kibana:数据可视化展示。
ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工作
# Elasticsearch索引到底能处理多大数据
单一索引的极限取决于存储索引的硬件、索引的设计、如何处理数据以及你为索引备份了多少副本。
通常来说,一个Lucene索引(也就是一个elasticsearch分片,一个es索引默认5个分片)不能处理多于21亿篇文档,或者多于2740亿的唯一词条。但达到这个极限之前,我们可能就没有足够的磁盘空间了!
当然,一个分片如何很大的话,读写性能将会变得非常差
二、安装
# 安装jdk
第一步:下载jdk1.8
https://www.oracle.com/java/technologies/downloads/#java
# jdk ---> jre --->jvm
# java se
# java ee
# java me
第二步:一路下一步安装
# 安装es
第一步:下载安装包https://www.elastic.co/cn/downloads/elasticsearch
第二部:解压压缩包
第三步:在cmd下敲 elasticsearch 运行(需要cd到bin文件路径,或者直接点击bin路径下的elasticsearch.bat,或者在bin的文件路径下直接敲cmd)
第四步:在浏览器打开 http://127.0.0.1:9200/
三、ElasticSearch之-ElasticSearch-head
# 第三方:nodejs写的客户端,es http restful接口通信的
# node环境---》已经有了
# 安装步骤
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
浏览器 http://localhost:9100/
# 注意要配置跨域---》es的配置文件(config>elasticsearch.yml)中加入
http.cors.enabled: true
http.cors.allow-origin: "*"
四、ElasticSearch之-安装Kibana
# 官方提供的:可以对es进行增删查改
kibana 版本要跟es版本对应
# 安装步骤
-下载kibana 7.5.0版本,解压
-配置链接es地址,由于都在本地的9200端口,默认连上了
# 修改配置文件:vim 安装目录/config/kibana.yml
server.port: 5601
server.host: "127.0.0.1"
server.name: lqz
elasticsearch.hosts: ["http://localhost:9200/"]
-来到kibana的bin路径,启动kibana # 输入kibana
-访问 127.0.0.1:5601
-点击dev-tools
五、es的插件
# es的有些扩展功能,需要借助于插件实现:比如中文分词器----》
# ik分词器:es中国作者写的
# 装插件的三种方式
-命令行
bin/elasticsearch-plugin install [plugin_name]
-url下载
bin/elasticsearch-plugin install [url]
-直接安装,下载完插件,解压后放到es--》plugin目录下
六、Elasticsearch之-倒排索引
# es的存储原理,为什么能实现大数据量的快速检索,全文检索
#倒排索引源于实际应用中需要根据属性的值来查找记录,这种索引表中的每一个项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而成为倒排索引。带有倒排索引的文件我们称之为倒排索引文件,简称倒排文件
属性值确定记录位置的索引方式称之为倒排索引
根据文章内容中的关键字建立索引称之为倒排索引
# keyword和text类型都是字符串类型
keyword不进行分词,直接建立索引
text类型进行分词,对分词建立索引
七、Elasticsearch之-索引操作
# 增
PUT lqz
{
"settings": {
"index":{
"number_of_shards":5,
"number_of_replicas":1
}
}
}
# 删
DELETE lqz
# 查
GET lqz/_settings # 查lqz索引的配置
GET lqz1/_settings
GET _all/_settings # 查所有索引的配置
GET _settings
GET lqz,lqz1/_settings# 查lqz,lqz1索引的配置
# 改(一般不改) 分片数量,副本数量
PUT lqz1/_settings
{
"number_of_replicas": 2 # 副本数量改为2
}
八、Elasticsearch之-映射管理
# es中类型---》mysql的表
# mysql中有建表语句----》es中就是映射管理---》即便没有类型,文档可以直接插入
# 映射:预先定义字段的类型及相关属性
# es字段类型
string类型:text,keyword # 区别
数字类型:long,integer,short,byte,double,float
java:byte,short,interger,long float,double
go语言中:int8 int16 int32 int64 float32,float64
日期类型:data
布尔类型:boolean
binary类型:binary
复杂类型:object(实体,对象,字典),nested(列表)
geo类型:geo-point,geo-shape(地理位置)
专业类型:ip,competion(搜索建议)
# es字段类型属性
-是否可以为空:所有类型
-字符串类型:analyzer 指定什么分词器
-日期类型:format
# 建立类型
# 6.x及以前版本------》books索引名字---》mapping下还有book,类型名(表名)
PUT books
{
"mappings": {
"book":{
"properties":{
"title":{
"type":"text",
"analyzer": "ik_max_word"
},
"price":{
"type":"integer"
},
"addr":{
"type":"keyword"
},
"company":{
"properties":{
"name":{"type":"text"},
"company_addr":{"type":"text"},
"employee_count":{"type":"integer"}
}
},
"publish_date":{"type":"date","format":"yyy-MM-dd"}
}
}
}
}
# 7.x及以上,6.x以后,强制一个索引下只能有一个类型,叫_doc (一个数据库只能建一个表)
PUT books
{
"mappings": {
"properties":{
"title":{
"type":"text"
},
"price":{
"type":"integer"
},
"addr":{
"type":"keyword"
},
"company":{
"properties":{
"name":{"type":"text"},
"company_addr":{"type":"text"},
"employee_count":{"type":"integer"}
}
},
"publish_date":{"type":"date","format":"yyy-MM-dd"}
}
}
}
# 插入文档
PUT books/_doc/1
{
"title":"大头儿子小偷爸爸",
"price":100,
"addr":"北京天安门",
"company":{
"name":"我爱北京天安门",
"company_addr":"我的家在东北松花江傻姑娘",
"employee_count":10
},
"publish_date":"2019-08-19"
}
#测试数据2
PUT books/_doc/2
{
"title":"白雪公主和十个小矮人",
"price":"99", #写字符串会自动转换
"addr":"黑暗森里",
"company":{
"name":"我的家乡在上海",
"company_addr":"朋友一生一起走",
"employee_count":10
},
"publish_date":"2018-05-19"
}
PUT books/_doc/3 # 这个也可以存
{
"age":"白雪公主和十个小矮人",
"name":'lqz'
}
## 查看映射
GET books/_mapping