一,介绍
Elasticsearch 是什么
-
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要发挥其强大的作用,你需使用Java并要将其集成到你的应用中。 Elasticsearch是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。 不过,Elasticsearch不仅仅是Lucene和全文搜索引擎,它还提供:
-
分布式的实时文件存储,每个字段都被索引并可被搜索
-
实时分析的分布式搜索引擎
-
可以扩展到上百台服务器,处理PB级结构化或非结构化数据
-
-
为什么用Elasticsearch?
-
用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
-
涉及到like的大数据量模糊查询,如果是直接对数据库进行查询的话,由于like模糊查询无法对数据列应用索引,所以需要一条条字符串进行比对查询,效率非常低下。所以在Java中,解决大数据量的模糊查询,就会用到建立索引库,全文检索的查询技术。
-
全文搜索引擎
-
生活中的数据分类
-
结构化数据
-
也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。
元数据(字典)是属于数据库本身的一些数据,包含数据库名、数据库字符集、表名、表的大小、表的记录行数、表的字符集、表的字段、表的索引、表的描述、字段的类型、字段的精度、字段的描述等。关于元数据描述:数据库实例的元数据介绍_数据管理 DMS-阿里云帮助中心
-
-
非结构化数据
-
又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、Word 文档,邮件,各类报表、图片和咅频、视频信息等。
-
-
半结构化数据
-
如果要更细致的区分的话,XML、HTML 可划分为半结构化数据。因为它们也具有自己特定的标签格式,所以既可以根据需要按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。
-
-
-
根据两种数据分类,搜索也相应的分为两种:
-
结构化数据搜索(对于结构化数据,因为它们具有特定的结构,所以我们一般都是可以通过关系型数据库(MySQL,Oracle 等)的二维表(Table)的方式存储和搜索,也可以建立索引。)
-
非结构化数据搜索
-
对于非结构化数据,也即对全文数据的搜索主要有两种方法
-
顺序扫描即按照顺序扫描的方式查询特定的关键字。
-
全文检索即将其结构化(设置索引)
-
-
-
-
全文检索技术以各类数据如文本、声音、图像等为对象,提供按数据的内容而不是外在特征来进行的信息检索,其特点是能对海量的数据进行有效管理和快速检索。它是搜索引擎的核心技术,同时也是电子商务网站的支撑技术。全文检索技术可应用于企业信息网站、媒体网站、政府站点、商业网站、数字图书馆数字图书馆和搜索引擎中。
-
全文搜索引擎主要由四大系统构成:
-
下载系统,用于从Web上采集各种类型的网页信息,并保持对Web变化的同步。
-
分析系统,用于对下载系统采集的信息进行PageRank和分词计算。
-
索引系统,用于将分析系统处理后的网页对象索引入库。
-
查询系统,用于分析用户提交的查询请求,然后从索引库中检索出相关网页并将网页排序后,以查询结果的形式返回给用户。
-
适用场景
检索类服务
-
搜索文库
-
电商商品检索
-
海量系统日志检索
问答类服务(本质上也是检索类)
-
在线智能客服
-
机器人
地图类服务
-
打车app
-
外卖app
-
社区团购配送
-
陌生人社交
倒排索引
1. 词典(Terms Dictionary):词典存储了所有不重复的词项(Terms),每个词项都有一个唯一的标识符(Term ID)。
2. 倒排列表(Inverted List):每个词项都对应一个倒排列表,倒排列表记录了包含该词项的文档的信息。每个倒排列表由多个倒排项(Inverted Item)组成,每个倒排项表示一个文档,包含文档的标识符、出现次数、位置等信息。
3. 位置信息(Position Information):对于需要进行短语查询的字段,倒排列表还会记录每个词项在文档中的具体位置。
4. 倒排索引缓存(Inverted Index Cache):为了提高查询性能,Elasticsearch会将部分倒排索引缓存在内存中,减少磁盘IO的开销。
数据格式类比
二,入门使用
1.索引
创建索引 :PUT 请求:http://127.0.0.1:9200/索引名称 (重复会报错)
查询所有 :GET 请求:http://127.0.0.1:9200/_cat/indices(查看所有索引)
_cat 表示查看的意思,indices 表示索引
查询单个 :GET 请求:http://127.0.0.1:9200/索引名称
删除索引 :DELETE 请求:http://127.0.0.1:9200/索引名称
2.文档
创建文档 :POST 请求 :http://127.0.0.1:9200/索引名称/_doc
POST 请求 :http://127.0.0.1:9200/索引名称/_doc/id(增加id唯一标识)
查询文档 :GET 请求 :http://127.0.0.1:9200/索引名称/_doc/id(主键查询)
GET 请求 :http://127.0.0.1:9200/索引名称/_search(全查询)
修改文档 : POST/PUT 请求 :http://127.0.0.1:9200/索引名称/_doc/id(全修改)
POST 请求 :http://127.0.0.1:9200/索引名称/_update/id(修改字段)
删除索引 :DELETE 请求:http://127.0.0.1:9200/索引名称/_doc/id
3.请求体查询
1.条件查询
2.查询全部
3.分页查询
4.查询指定字段
5.查询并排序
6.多条件查询
7.范围查询
8.完全匹配
9.高亮查询
10.聚合查询
4.映射关系
创建映射 :PUT 请求:http://127.0.0.1:9200/索引名称/_mapping
数据说明 :
-
字段名:任意填写,下面指定许多属性,例如:title、subtitle、images、price
-
type:类型,Elasticsearch 中支持的数据类型非常丰富,说几个关键的:
-
String 类型,又分两种:
-
text:可分词
-
keyword:不可分词,数据会作为完整字段进行匹配
-
-
Numerical:数值类型,分两类
-
基本数据类型:long、integer、short、byte、double、float、half_float
-
浮点数的高精度类型:scaled_float
-
-
Date:日期类型
-
Array:数组类型
-
Object:对象
-
-
index:是否索引,默认为 true,也就是说你不进行任何配置,所有字段都会被索引。
-
true:字段会被索引,则可以用来进行搜索
-
false:字段不会被索引,不能用来搜索
-
-
store:是否将数据进行独立存储,默认为 false
-
原始的文本会存储在source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从source 里面提取出来的。当然你也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source 中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
-
-
analyzer:分词器,这里的 ik_max_word 即使用 ik 分词器,后面会有专门的章节学习
三,集群部署
1.配置
1.集群名字
2.配置节点
3.linux部署
解压软件
# 解压缩 tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz -C /opt/module # 改名 mv elasticsearch-7.8.0 es
创建用户
-
因为安全问题,Elasticsearch 不允许 root 用户直接运行,所以要创建新用户,在 root 用户中创建新用户。
useradd es #新增 es 用户 passwd es #为 es 用户设置密码 userdel -r es #如果错了,可以删除再加 chown -R es:es /opt/module/es #文件夹所有者
修改配置文件
-
修改/opt/module/es/config/elasticsearch.yml 文件
# 加入如下配置 cluster.name: elasticsearch node.name: node-1 network.host: 0.0.0.0 http.port: 9200 cluster.initial_master_nodes: ["node-1"]
-
修改/etc/security/limits.conf
# 在文件末尾中增加下面内容 # 每个进程可以打开的文件数的限制 es soft nofile 65536 es hard nofile 65536
-
修改/etc/security/limits.d/20-nproc.conf
# 在文件末尾中增加下面内容 # 每个进程可以打开的文件数的限制 es soft nofile 65536 es hard nofile 65536 # 操作系统级别对每个用户创建的进程数的限制 * hard nproc 4096 # 注:* 带表 Linux 所有用户名称
-
修改/etc/sysctl.conf
# 在文件中增加下面内容 # 一个进程可以拥有的 VMA(虚拟内存区域)的数量,默认值为 65536 vm.max_map_count=655360
-
重新加载
sysctl -p
启动软件
cd /opt/module/es/ #启动 bin/elasticsearch #后台启动 bin/elasticsearch -d
-
启动时,会动态生成文件,如果文件所属用户不匹配,会发生错误,需要重新进行修改用户和用户组。
chown -R es:es /opt/module/es
-
关闭防火墙
#暂时关闭防火墙 systemctl stop firewalld #永久关闭防火墙 systemctl enable firewalld.service #打开放货抢永久性生效,重启后不会复原 systemctl disable firewalld.service #关闭防火墙,永久性生效,重启后不会复原