CentOS8搭建全文搜索引擎Elasticsearch
Elasticsearch介绍
简介
Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。
用途
Elasticsearch 在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内容,这意味着其可用于多种用例:应用程序搜索、网站搜索、企业搜索、日志处理和分析、基础设施指标和容器监测、应用程序性能监测、地理空间数据分析和可视化、安全分析、业务分析。
工作原理
原始数据会从多个来源(包括日志、系统指标和网络应用程序)输入到 Elasticsearch 中。数据采集指在 Elasticsearch 中进行索引之前解析、标准化并充实这些原始数据的过程。这些数据在 Elasticsearch 中索引完成之后,用户便可针对他们的数据运行复杂的查询,并使用聚合来检索自身数据的复杂汇总。在 Kibana 中,用户可以基于自己的数据创建强大的可视化,分享仪表板,并对 Elastic Stack 进行管理。
Elasticsearch索引
Elasticsearch 索引指相互关联的文档集合。Elasticsearch 会以 JSON 文档的形式存储数据。每个文档都会在一组键(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、数值组、地理位置或其他类型的数据)之间建立联系。
Elasticsearch 使用的是一种名为倒排索引的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。
在索引过程中,Elasticsearch 会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引 API 中启动的,通过此 API 您既可向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。
Logstash 用途
Logstash 是 Elastic Stack 的核心产品之一,可用来对数据进行聚合和处理,并将数据发送到 Elasticsearch。Logstash 是一个开源的服务器端数据处理管道,允许您在将数据索引到 Elasticsearch 之前同时从多个来源采集数据,并对数据进行充实和转换。
Kibana 用途
Kibana 是一款适用于 Elasticsearch 的数据可视化和管理工具,可以提供实时的直方图、线形图、饼状图和地图。Kibana 同时还包括诸如 Canvas 和 Elastic Maps 等高级应用程序;Canvas 允许用户基于自身数据创建定制的动态信息图表,而 Elastic Maps 则可用来对地理空间数据进行可视化。
Elasticsearch优点
Elasticsearch 很快。由于 Elasticsearch 是在 Lucene 基础上构建而成的,所以在全文本搜索方面表现十分出色。Elasticsearch 同时还是一个近实时的搜索平台,这意味着从文档索引操作到文档变为可搜索状态之间的延时很短,一般只有一秒。因此,Elasticsearch 非常适用于对时间有严苛要求的用例,例如安全分析和基础设施监测。
Elasticsearch 具有分布式的本质特征。Elasticsearch 中存储的文档分布在不同的容器中,这些容器称为分片,可以进行复制以提供数据冗余副本,以防发生硬件故障。Elasticsearch 的分布式特性使得它可以扩展至数百台(甚至数千台)服务器,并处理 PB 量级的数据。
Elasticsearch 包含一系列广泛的功能。除了速度、可扩展性和弹性等优势以外,Elasticsearch 还有大量强大的内置功能(例如数据汇总和索引生命周期管理),可以方便用户更加高效地存储和搜索数据。
Elastic Stack 简化了数据采集、可视化和报告过程。通过与 Beats 和 Logstash 进行集成,用户能够在向 Elasticsearch 中索引数据之前轻松地处理数据。同时,Kibana 不仅可针对 Elasticsearch 数据提供实时可视化,同时还提供 UI 以便用户快速访问应用程序性能监测 (APM)、日志和基础设施指标等数据。
Elasticsearch基本概念
Node 与 Cluster
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
Index
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
1 | 查看当前节点的所有 Index |
Document
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示。
同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。
Type
Document 可以分组,比如weather
这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。
不同的 Type 应该有相似的结构(schema),举例来说,id
字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products
和logs
)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
1 | 列出每个 Index 所包含的 Type |
Elasticsearch安装
前提
JAVA环境,JAVA_HOME配置。
安装
1 | wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip |
如果报错“max virtual memory areas vm.maxmapcount [65530] is too low”,解决:
sudo sysctl -w vm.max_map_count=262144
如果报错”killed”,解决:
# 原因:服务器可用内存没有达到es虚拟机所需内存的默认值。
vim elasticsearch-5.5.1/config/jvm.options
将-Xmx
(堆内存) 和-Xms
(初始堆内存) 均修改为128m
如果报错”can not run elasticsearch as root”,解决:
chown -R 一般用户 elasticsearch-5.5.1/
su 一般用户
如果报错”main ERROR Could not register mbeans java.security.AccessControlException: access denied “javax.management.MBeanTrustPermission” “register”)”,解决:
# 修改jdk的文件/usr/java/jdk1.8.0_311-amd64/jre/lib/security/java.policy,在文件中添加如下内容
grant {
permission javax.management.MBeanTrustPermission “register”;
};source /etc/profile
如果报错”Failed to load settings from /usr/local/elasticsearch-5.5.1/config/elasticsearch.yml”,解决:
vim elasticsearch-5.5.1/config/elasticsearch.yml
path.data: /usr/local/es/data
path.logs: /usr/local/es/logs
network.host: 192.168.198.200
http.port: 9200
discovery.zen.minimum_master_nodes: 1mkdir -p /usr/local/es/data
mkdir -p /usr/local/es/logschown -R 一般用户 /usr/local/es/
如果一切正常,Elastic 在默认的9200端口运行。
请求该地址,测试,得到如下说明信息。
1 | curl localhost:9200 |
Elasticsearch使用
新建和删除 Index
新建 Index,可以直接向 Elastic 服务器发出 PUT 请求
1 | # 新建一个名叫weather的 Index |
中文分词设置
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.5.1/elasticsearch-analysis-ik-5.5.1.zip
重新启动 Elastic
新建一个 Index,指定需要分词的字段。
新建一个名称为accounts
的 Index,里面有一个名称为person
的 Type。person
有三个字段:user、title、desc。这三个字段都是中文,而且类型都是文本(text),所以需要指定中文分词器,不能使用默认的英文分词器。
Elastic 的分词器称为 analyzer,search_analyzer
是搜索词的分词器。ik_max_word
分词器是插件ik
提供的,可以对文本进行最大数量的分词。
1 | curl -X PUT 'localhost:9200/accounts' -d |
数据操作
新增
向/accounts/person
发送请求,就可以新增一条人员记录。
1 | curl -X PUT 'localhost:9200/accounts/person/1' -d |
服务器返回的 JSON 对象,会给出 Index、Type、Id、Version 等信息。
1 | { |
新增记录的时候,也可以不指定 Id,这时要改成 POST 请求。
1 | curl -X POST 'localhost:9200/accounts/person' -d |
服务器返回的 JSON 对象里面,_id
字段就是一个随机字符串。
1 | { |
查看
向/Index/Type/Id
发出 GET 请求,就可以查看这条记录。URL 的参数pretty=true
表示以易读的格式返回。
1 | curl 'localhost:9200/accounts/person/1?pretty=true' |
返回的数据中,found
字段表示查询成功,_source
字段返回原始记录。
1 | { |
如果 Id 不正确,就查不到数据,found
字段就是false
。
1 | curl 'localhost:9200/weather/beijing/abc?pretty=true' |
删除
删除记录就是发出 DELETE 请求。
1 | curl -X DELETE 'localhost:9200/accounts/person/AX3WoN-j3Rv8LA4_CYHa' |
更新
更新记录就是使用 PUT 请求,重新发送一次数据。
1 | curl -X PUT 'localhost:9200/accounts/person/1' -d |
返回结果
1 | { |
可以看到,记录的 Id 没变,但是版本(version)从1
变成2
,操作类型(result)从created
变成updated
,created
字段变成false
,因为这次不是新建记录。
查询
使用 GET 方法,直接请求/Index/Type/_search
,就会返回所有记录。
1 | curl 'localhost:9200/accounts/person/_search' |
返回结果的 took
字段表示该操作的耗时(单位为毫秒),timed_out
字段表示是否超时,hits
字段表示命中的记录。
返回的记录中,每条记录都有一个_score
字段,表示匹配的程序,默认是按照这个字段降序排列。
全文搜索
Elastic 的查询非常特别,使用自己的查询语法,要求 GET 请求带有数据体。
1 | curl 'localhost:9200/accounts/person/_search' -d |
上面代码使用 Match 查询,指定的匹配条件是desc
字段里面包含”软件”这个词。返回结果如下。
1 | { |
Elastic 默认一次返回10条结果,可以通过size
字段改变这个设置。还可以通过from
字段,指定位移。
1 | curl 'localhost:9200/accounts/person/_search' -d ' |
上面代码指定,从位置1开始(默认是从位置0开始),只返回一条结果。
逻辑运算
如果有多个搜索关键字, Elastic 认为它们是or
关系。
1 | curl 'localhost:9200/accounts/person/_search' -d |
如果要执行多个关键词的and
搜索,必须使用布尔查询。
1 | curl 'localhost:9200/accounts/person/_search' -d |