全文检索
数据分类
我们生活中的数据总体分为三种:结构化数据,非结构化数据,半结构化数据
结构化数据:指具有固定格式或有限长度的数据,如数据库(mysql oracle ...),元数据等。
非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等
半结构化数据,如XML,HTML等
非结构化数据又一种叫法叫
全文数据
。
对结构化数据的搜索:如对数据库的搜索,用SQL语句。
对元数据的搜索,如利用windows搜索对文件名,类型,修改时间进行搜索等。
对非结构化数据的搜索:如利用windows的搜索也可以搜索文件内容,Linux下的grep命令,再如用Google和百度可
以搜索大量内容数据。
非结构化数据搜索方法
顺序扫描
:
比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。
如利用windows的搜索也可以搜索文件内容,只是相当的慢。如果你有一个500G硬盘,如果想
在上面找到一个内容包含某字符串的文件,不花他几个小时,怕是做不到。Linux下的grep命令
也是这一种方式。大家可能觉得这种方法比较原始,但对于小数据量的文件,这种方法还是最直
接,最方便的。但是对于大量的文件,这种方法就很慢了。
全文检索(倒排索引
es的核心
)
:
将非结构化数据中的一部分信息提取出来,重新组织,使其
变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的
。
这部分从非结构化数据中提取出的然后重新组织的信息,我们称之
索引
。
这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个
属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记
录的位置,因而称为
倒排索引(inverted index)
。(实际参考es中文档)
什么是 Elasticsearch?
E(对数据进行全文索引)
L(采集日志)
K(查询界面)
Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、
数字、地理空间、结构化和非结构化数据。Elasticsearch 在 Apache Lucene 的基础上开发而
成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单
的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;
Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。人们通常将
Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic
Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向
Elasticsearch 发送数据。
用途:
Elasticsearch 在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内
容,这意味着其可用于多种用例:
应用程序搜索
网站搜索
企业搜索
日志处理和分析
基础设施指标和容器监测
应用程序性能监测
地理空间数据分析和可视化
安全分析
业务分析
基本概念:
近实时 near realtime(nrt)
Elasticsearch是一个几乎实时的搜索平台。意思是,从索引一个文档到这个文档可被搜索只需要一点点的延迟,这个时间一般为毫秒级。
cluster 集群
群集是一个或多个节点(服务器)的集合, 这些节点共同保存整个数据,并在所有节点上提
供联合索引和搜索功能。一个集群由一个唯一集群ID确定,并指定一个集群名(默认
“elasticsearch”)。该集群名非常重要,因为节点可以通过这个集群名加入群集,一个节点
只能是群集的一部分。
node 节点
节点是单个服务器实例,它是集群的一部分,可以存储数据,并参与群集的索引和搜索功能。就像一个集群,节点的名称默认为一个随机的通用唯一标识符(UUID),确定在启动时分
配给该点。如果不希望默认,可以定义任何节点名。
index 索引
索引
是具有相似特性的
文档集合
(近似理解为数据库中的某张表)。例如,可以为客户数据提供索引,为产品目录建立另一个索引,以及为订单数据建立另一个索引。索引由名称(必须全部为
小写)标识,该名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引。
就像关
系数据库中的“
数据表
”。它有一个定义多种类型的映射。索引是逻辑名称空间,映射到一个或
多个主分片,并且可以有零个或多个副本分片。
document 文档
文档是可以被索引的信息
的基本
单位。
也是全文搜索中被搜索的对象,可以对应一个网页,
一篇txt文档或者一个商品。 相当于关系型数据库中的表中的一行记录。
例如,您可以为单个客
户提供一个文档,单个产品提供另一个文档,以及单个订单提供另一个文档。es本文件的表示
形式为JSON(JavaScript Object Notation)格式,这是一种非常普遍的互联网数据交换格
式。
似于关系数据库中的一行。
文档和索引的关系原理讲解:
文档(txt,doc,docx....):
1, 人生永远不可能复制,要珍惜每一份缘分 a.txt
2, 珍惜人生的每次相遇,就是缘分 b.txt
3, 人生中存在很多相遇和离别,都是缘分中的注定 c.txt
提取关键字(
https://www.elastic.co/guide/cn/elasticsearch/guide/current/stopwords.html使
用中文分词技术
排除停用词
https://wenku.baidu.com/view/8927eede80eb6294dd886c46.html
)
1, 人生 永远 复制 珍惜 缘分
2, 珍惜 人生 相遇 缘分
3, 人生 存在 相遇 离别 缘分 注定
创建索引
人生 -> 1,2,3
永远 -> 1
复制 1
珍惜 1,2
缘分 1,3
倒排索引又叫反向索引以字或词为文档中出现的位置情况。
shards replicas 碎片和副本
shards:分片数,一个索引分几个片存储,多个分片可以
提升读写速度
。索引可以存储大量的数据,这些数据可能
(分片解决)超过单个节点的硬件限制
。例如,十亿个文件占用磁盘空间
1TB的单指标可能不适合对单个节点的磁盘或可能太慢服务仅从单个节点的搜索请求。
replicas:
副本数量,分多个副本存储索引,好处是防止一个节点挂掉,数据丢失(
防止单点故障
)。
它在碎片/节点出现故障时提供高可用性(
提高可用性
)。
它允许您扩展搜索量/吞吐量,因为可以在所有副本上并行执行搜索(
提高搜索速度
)。
下载配置,搭建集群:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.tar.gz
集群规划:
es1 192.168.206.131
es2 192.168.206.132
es3 192.168.206.133
解压:
tar -zxvf elasticsearch-6.4.0.tar.gz -C /usr/
修改名称
mv /usr/elasticsearch-6.4.0/ /usr/elasticsearch/
配置环境变量:
vim /etc/porfile
添加配置
export ES_HOME=/usr/elasticsearch
修改配置:
PATH=$ES_HOME/bin
让配置生效:
source /etc/profile
es配置:
1,在/usr/elasticsearch创建数据data,后面配置用到:
mkdir /usr/elasticsearch/data
2,在/etc/sysctl.conf最后添加(解决:max virtual memory areas vm.max_map_count
[65530] is too low错误,vm.max_map_count单个JVM能开启的最大线程数)
vim /etc/sysctl.conf
vm.max_map_count=655360
让文件生效:
sysctl -p
3,
在/etc/security/limits.conf最后添加:(不配置缺省值:1024,解除 Linux 系统的最大进程数和最大文件打开数限制:* 代表针对所有用户
ues表示启动用户名称,与下面创建用户
一致
noproc 是代表最大进程数 nofile 是代表最大文件打开数 )
https://blog.csdn.net/weixin_30682415/article/details/97661062vim /etc/security/limits.confues soft nofile 65536ues hard nofile 131072ues soft nproc 4096ues hard nproc 4096
4,修改节点的配置文件jvm.options
vim /usr/elasticsearch/config/jvm.options (22行)-Xms512m-Xmx512m
原则:
最小堆的大小和最大堆的大小应该相等。
Elasticsearch可获得越多的堆,并且内存也可以使用更多的缓存。但是需要注意,分配了太多的堆给你的项目,将会导致有长时间的垃圾搜集停留。
设置最大堆的值不能超过你物理内存的50%,要确保有足够多的物理内存来保证内核文件缓存。
5,修改配置文件 ElasticSearch.yml
vim /usr/elasticsearch/config/elasticsearch.yml
# 17行cluster.name: my-app#23行node.name: node-1# 33path.data: /usr/elasticsearch/data# 37path.logs: /usr/elasticsearch/logs# 43 44bootstrap.memory_lock: falsebootstrap.system_call_filter: false # 44行额外添加该配置#56network.host: 192.168.23.30#60http.port: 9200#当启动新节点时,通过这个ip列表进行节点发现,组建集群 69discovery.zen.ping.unicast.hosts: ["cr1", "cr2","cr3"]#通过配置这个参数来防止集群脑裂现象 (集群总节点数量/2)+1 73discovery.zen.minimum_master_nodes: 2
因为配置文件中配置了集群节点的主机名称,所以在/etc/hosts添加下面配置:
vim /etc/hosts
192.168.206.131 es1
192.168.206.132 es2
192.168.206.133 es3
6,由于es启动不能直接使用root用户
创建用户:
useradd ues;
赋权:
chown -R ues:ues /usr/elasticsearch
查看:
ll /usr/ |grep elasticsearch
ll /usr
ll /usr/elasticsearch
复习免密:
ssh-keygen -t rsa 三次回车
ssh-copy-id es2 yes 输入密码:tiger
ssh-copy-id es3 yes 输入密码:tiger
7,发送配置好的es到其他节点上:
cd /usr/
直接使用scp命令, 之前配置过ssh免密登录
scp -r /usr/elasticsearch/ cr2:/usr/
scp -r /usr/elasticsearch/ cr3:/usr/
8,在其他节点修改配置及创建用户并赋权(当前集群在cr2和cr3上操作)
发送hosts:
scp /etc/hosts es2:/etc/
scp /etc/hosts es3:/etc/
发送环境变量
scp /etc/profile cr2:/etc/
scp /etc/profile cr3:/etc/
发送/etc/sysctl.conf
scp /etc/sysctl.conf cr2:/etc/
scp /etc/sysctl.conf cr3:/etc/
发送 /etc/security/limits.conf
scp /etc/security/limits.conf cr2:/etc/security/
scp /etc/security/limits.conf cr3:/etc/security/
9,在cr2和cr3上操作(或者在all session):
让文件生效:
sysctl -p
让环境变量生效:
source /etc/profile
vim /usr/elasticsearch/config/elasticsearch.yml
分别修改23和56行
node.name: node-2 //cr3上为3
network.host: 192.168.23.31 //cr3上为32
创建用户:
useradd ues;
赋权:
chown -R ues:ues /usr/elasticsearch
查看:
ll /usr/ |grep elasticsearch
启动:
切换到ues用户
su ues;
在to All Sessions中启动:(
如果启动时,是在root账号下启动的会报错,需要重新修改
一下elasticsearch目录的所有者,再用ues账号启动
)
elasticsearch -d;
关闭进程用kill -9 进程id
查看结果:
curl 192.168.23.31:9200
三个IP都可以测试链接
还可以测试挂掉节点,再启动,注意,启动时速度不会快,可以看着日志
常用集群命令
查看集群支持命令:
curl 192.168.23.30:9200/_cat
查看集群是否健康
curl 192.168.23.30:9200/_cat/health
curl 192.168.23.30:9200/_cat/health?help
curl 192.168.23.30:9200/_cat/health?v
绿色表示一切正常, 黄色表示所有的数据可用但是部分副本还没有分配,红色表示不可用
查看master:
curl 192.168.23.30:9200/_cat/master?v
命令支持help:
curl 192.168.23.30:9200/_cat/master?help
查看所有索引:
curl 192.168.23.30:9200/_cat/indices
kibana的简介和使用
简介:
Kibana 是通向 Elastic 产品集的窗口。 它可以在 Elasticsearch 中对数据进行视觉探索
和实时分析。 Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索,查看,
用来交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分
析及展示。
解压配置:
下载上传文件到虚拟机
解压:
tar -xzvf kibana-6.4.0-linux-x86_64.tar.gz -C /usr/
改名:
mv /usr/kibana-6.4.0-linux-x86_64/ /usr/kibana
配置环境变量:
vim /etc/profile
source /etc/profile
修改配置:
cd /usr/kibana
vim config/kibana.yml
:2 端口号 :7 主机IP :28 es url地址
2 server.port: 56017 server.host: "192.168.48.151"28 elasticsearch.url: "http://192.168.48.151:9200"
启动访问(不兼容360浏览器):
kibana (配置过环境变量,非守护运行) ctrl+c 直接关闭
kibana & (守护方式运行) 关闭麻烦点
ps -ef |grep kibana 查找进程
kill -9 xxxx 杀死进程
启动完毕,显示:
server running at
http://192.168.23.211:5601
在ES中创建,修改和删除索引及数据的增删改查:
数据类型
核心类型(
Core datatype)
字符串:string,string类型包含 text 和 keyword。
text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建
立 索引;允许es来检索这些词,text类型不能用来排序和聚合。例如电子邮件主体部分或者一
款产品的介绍
keyword:该类型不需要进行分词,可以被用来检索过滤、排序和聚合, 可以满足电子邮箱地
址、主机名、状态码、邮政编码和标签等数据的要求。
数值型:long、integer、short、byte、double、float
日期型:date
布尔型:boolean
二进制型:binary
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
索引的管理:
创建索引的语法
PUT /my_index
{
"settings": { ... any settings ... },
"mappings": {
"type_one": { ... any mappings ... },
"type_two": { ... any mappings ... },//
6.0之前的版本可以
...
}
}
number_of_shards:每个索引的主分片数,这个配置在索引创建后不能修改。默认值
为5
number_of_replicas:每个主分片的副本数,默认值是 1 。对于活动的索引库,这
个配置可以随时修改。
mappings:
映射(Mapping) 相当于数据表的表结构
创建索引的示例
PUT /i
ndex_hr
{
"settings":{
"number_of_shards":3,
"number_of_replicas":1
},
"mappings":{
"emp_type":{
"properties":{
"empno":{
"type":"integer"
},
"ename":{
"type":"keyword"
},
"job":{
"type":"keyword"
},
"salary":{
"type":"double"
},
"deptno":{
"type":"integer"
},
"hiredate":{
"type":"date"
}
}
}
}
}
成功返回:
{"acknowledged":true,"shards_acknowledged":true,"index":"my_index"}
GET _all/ 查看所有索引
GET _all/_settings 查看索引配置
GET /emp_index/_mapping/ 查看指定索引下的配置
创建索引时如果503(master_not_discovered_exception)
删除集群各节点下的data下的数据
rm -rf /usr/elasticsearch/data/*
重启集群
2、修改索引
PUT /my_index/_settings
{
"number_of_replicas": 1
}
{"acknowledged":true}
3、删除索引
DELETE /my_index //删除单个索引
DELETE /index_one,index_two //删除多个索引
DELETE /index_* //删除以index_开头的索引
DELETE /_all //删除所有索引
{"acknowledged":true}
可以设置下面的属性,使DELETE /_all 失效,必须指定索引名称,才可以删除。
elasticsearch.yml
action.destructive_requires_name: true
数据管理:
1,插入数据
指定ID插入:
post 192.168.23.30:9200/my_index/my_doc/1
{
"my_field":"aaa"
}
返回:
{"_index":"my_index","_type":"my_type","_id":"1","_version":1,"result":"created","_shards":
{"total":1,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}
POST /emp_index/emp_type/ 1{"empno" : 1001 ,"ename" : " 张三 " ,"hiredate" : "2002-10-10" ,"job" : " 扫地 " ,"salary" : 800.0}POST /emp_index/emp_type/ 2{"empno" : 1002 ,"ename" : " 李四 " ,"hiredate" : "2002-10-10" ,"job" : " 扫地 " ,"salary" : 800.0}
不指定ID插入:
返回:
{"_index":"my_index","_type":"my_type","_id":"s40HiGwBg5JLnGO8RVwg","_version":1,"result":"created","_shards":{"total":1,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}
查询数据
查询所有
/index_hr/_search 注意传递的参数{}
带参数查询:
get 192.168.23.30:9200/
index_hr/_search?q=ename:lisi
指定
id查询:
get 192.168.23.30:9200/
index_hr/emp_type/2
GET /emp_index/_search
GET /emp_index/_search?q=empno: 1001
更新数据:
根据ID更新
post 192.168.182.66:9200/index_hr/emp_type/1
#
更新
PUT /emp_index/emp_type/ 1{"ename" : " 张三峰 " ,"hiredate" : "2002-10-12" ,"job" : " 扫地 x" ,"salary" : 801.0}
4 ,删除数据
根据id删除
delete 192.168.182.66:9200/index_hr/emp_type/1再次查询{"_index":"my_index","_type":"my_type","_id":"s40HiGwBg5JLnGO8RVwg","found":false}