【ES从入门到实战】十七、全文检索-ElasticSearch-进阶-aggregations聚合分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【ES从入门到实战】十七、全文检索-ElasticSearch-进阶-aggregations聚合分析相关的知识,希望对你有一定的参考价值。
参考技术A 聚合提供了从数据中 分组和提取数据 的能力。最简单的聚合方法大致等于 SQL GROUP BY 和 SQL 聚合函数 。
在 Elasticsearch 中,您有执行搜索返回 hits (命中结果),并且同时返回聚合结果,
把一个响应中的所有hits(命中结果)分隔开的能力。这是非常强大且有效的,您可以执行查询和多个聚合,
并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的 API 来避免网络往返。
aggregations 查询语法:
举个栗子:
更多聚合查询操作,请参考 ES 官方文档: 参考文档-search-aggregations
参考:
Elasticsearch Reference
elastic
全文搜索引擎 Elasticsearch 入门教程
ElasticSearcho从入门到放弃:简介, lucene,概念, 安装
文章目录
一、ElasticSeach简介
官方网站: https://www.elastic.co/cn/elasticsearch/
1. 介绍
- Elasticsearch是一个基于Lucence的搜索服务器;
- 提供了一个分布式多用户能力的全文搜索引擎, 基于RESTful web接口;
- Elasticsearch是用java语言发开的, 并作为Apache许可条款下的开放源码发布, 是一种流行的企业级搜索引擎;
- ES用于云计算中, 能够达到实时搜索, 稳定, 可靠,快速,安装使用方便;官方客户端维护多种编程语言可用;
- 根据DB-Engines排名显示, ES是最受欢迎的企业所搜索引擎;
2. ES可以做什么
2.1 信息检索
2.2 企业内部系统搜索
- 关系型数据库使用like进行模糊检索, 会导致索引失效, 效率低下;
- 可以基于ES来进行检索, 效率非常高;
2.3 数据分析引擎
ES聚合可以对数十一行日志数据进行聚合分析, 套索数据的趋势和规律;
3. ES特点
3.1 海量数据处理
- 大型分布式集群(数百台规模服务器)
- 处理PB级数据
- 小公司也可以进行单机部署;
3.2 开箱即用
- 简单易用, 操作简单
- 快速部署生产环境
3.3 作用传统数据库的补充
- 传统关系型数据库不擅长全文检索(mysql自带的全文索引, 与ES性能差距非常大)
- 传统关系型数据无法支持搜索排名, 海量数据存储, 分析 等功能;
- ES可以作为传统关系型数据库的补充, 提供RDBM无法提供的功能;
4. ES对比solr:
- solr利用Zookeeper进行分布式管理, 而ES自带有分布式协调管理功能;
- Solr支持更多格式的数据, 而ES仅支持json文件格式;
- Solr官方提供的功能更多, 而ES本身更注重于核心功能, 高级功能多有第三方插件提供;
- Solr在传统的搜索应用中表现好于ES, 但在处理实时搜索应用是时, ES的效率更高;
二、Lucene全文检索库
1. 什么是全文检索
1.1 结构化数据与非结构化数据
- 结构化数据: 指具有固定格式或优先长度的数据, 如: 数据库, 元数据等;
- 非结构化数据: 指不定长或无固定格式的数据, 如: 邮件, 图片等磁盘上的文件;
1.2 搜索结构化数据和非结构化数据
- 使用SQL语言专门搜索结构化数据;
- 使用ES/Lucene/Solr建立倒排索引, 根据关键字就可以搜索一些非结构化数据;
1.3 全文检索:
全文检索是指:
- 通过一个程序扫描文本中的每个单词, 针对单词建立索引, 并保存该单词在文本中的位置以及出现的频次;
- 用户查询时, 通过之前建立好的索引来查询, 将索引单词对应的文本位置, 出现的次数返回给用户, 因为有了具体的位置, 就可以将具体的内容读出来;
- 类似于通过字典中, 检索字表查字的过程
2. Lucene简介
- Lucene是一种高性能的全文检索库, 2000年开源, 最初有Doug Cutting(道格·卡丁)开发;
- Lucnee是Apache的一个顶级开源醒目, 是一个全文检索引擎工具包; 但Lucene不是一个完整的全文检索引擎, 它只是提供一个基本的全文检索的架构, 还提供了一些基本的分词库;
- Lucene是一个简单易用的工具包, 可以方便的实现全文检索的功能;
三、ES的核心概念:
1. 索引 index:
- 一个索引就是一个拥有几分相似特征的文档的集合;
- 一个索引由一个名字来标识(必须全部是小写字母);
- 在一个集群中, 可以定义任意多的索引;
2. 映射 mapping
- ES中的映射(Mapping)用来定义一个文档;
- mapping是处理数据的方式和规则方面做一些限制; 如: 字段的数据类型, 默认值, 分析器, 是否被索引;
- 类似mysql在建表时, 指定字段和字段类型;
3. 字段 Field
相当于数据表中的字段, 对文档数据根据不同属性进行的分类标识;
4. 类型type
每一个字段都应该有一个对应的类型, 例如: Text, Keyword, Byte等;
5. 文档 document
- 一个文档是一个可被索引的基础信息单元; 比如: 可以拥有某一个客户的文档, 某一个产品的一个文档; 当然, 也可以是拥有某个订单的一个文档;
- 文档以json格式来表示;
6. 集群 cluster
- 一个集群就是由一个或多个节点组织在一起, 它们共同持有整个的数据, 并一起提供索引和搜索功能;
- 一个集群由一个唯一的名字标识, 这个名字默认就是 “elasticsearch”;
- 这个名字是重要的, 因为一个节点只能通过指定的某个集群名字来加入这个集群;
7. 节点 node
- 一个节点时集群中的一个服务器, 作为集群的一部分, 它存储数据, 参与集群的索引和搜索功能;
- 一个节点可以通过配置集群名称的方式加入一个指定的集群; 默认情况下, 每个节点都会被安排加入到 "elasticsearch"的集群中;
- 这意味着, 如果网络中启动了若干个节点, 并假定它们能够相互发现, 它们将会自动的形成并加入到集群中;
- 在一个集群里, 可以拥有任意多个节点, 而且, 如果有网络中没有运行任何的ES节点, 这时启动一个节点, 会默认创建并加入到 "elasticsearch"的集群中;
8. 分片和副本: shards & replicas
8.1 分片
- 一个索引可以存储超出单个节点硬件限制的大量数据; 比如, 一个具有10亿文档的索引占据1TB的磁盘空间, 而任一节点都没有这样大的磁盘空间, 或者单个节点处理搜索请求, 响应太慢;
- 为了解决这个问题, ES提供了将索引划分成多份的能力, 这些份被称为分片;
- 当创建一个索引的时候, 可以指定想要的分片数量;
- 每个分片本身也是一个功能完善并且独立的"索引", 这个"索引"可以被防止到集群中的任何节点上;
- 分片功能主要体现在:
- 允许水平分割/扩展内容容量;
- 允许在分片之上进行分布式, 并行的操作, 进而提高性能和吞吐;
- 至于一个分片怎样分布, 文档怎样聚合, 搜索请求怎么处理, 是完全有ES管理的, 对于用户来说, 是透明的;
8.2 副本
- 在一个网络/云的环境中, 失败随时都可能发生, 在某个分片/节点突然处于离线状态;
四. 安装ES:
1. 安装es:
操作系统: centos7
1.1 创建普通用户:
ES不能使用root用户, 必须使用普通用户来安装启动;
创建一个es专门的用户
useradd esuser
passwd es123
1.2 为普通用户添加sudo权限
执行visudo
打开用户权限管理文件
esuser ALL=(ALL) ALL
1.3 准备安装包
下载地址: https://www.elastic.co/cn/downloads/elasticsearch
在服务器上创建es
目录, 并修改owner为esuser用户
mkdir -p /export/server/es
chown -R esuser /export/server/es
# 解压ES
su esuser
cd /export/software
tar -zvxf elasticsearch-xxx.tar.gz -C /export/server/es/
1.4 修改配置文件
1.4.1 修改elasticsearch.yml
使用esuser
用户来修改配置文件
cd /export/server/es/elasticsearch-xxx/config
mkdir -p /export/server/es/elasticsearch-xxx/log
mkdir -p /export/server/es/elasticsearch-xxx/data
rm -rf elasticsearch.yml
elasticsearch.yml
clister.name: elasticsearch
node.name: node1
path.data: /export/server/es/elasticsearch-xxx/data
path.log: /export/server/es/elasticsearch-xxx/log
network.host: node1
http.port: 9200
discovery.seed_host: ["node1", "node2", "node3"]
cluster.initial_master_nodes: ["node1", "node2"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"
ps: node(x): 为节点地址(域名或ip)
clister.name: 集群名称
node.name: 当前节点名称
path.data, path.log: 数据和日志目录
network.host: 当前网络地址
http.port:服务端口号
discovery.seed_host: 互相发现的地址列表
cluster.initial_master_nodes:初始化master节点列表
bootstrap.system_call_filter: 系统调用过滤
bootstrap.memory_lock: 内存锁定
http.cors.enabled, http.cors.allow-origin: 跨域相关, 开放
1.4.2 修改jvm.option
修改jvm.option配置文件, 调整jvm堆内存大小
/export/server/es/elasticsearch-xxx/config/ jvm.options
-Xms2g
-Xmx2g
1.5 配置其他节点
1.6 修改系统配置, 解决启动问题
由于现在使用普通用户来安装es服务, 且es服务对服务器要求的资源比较多, 包括内存大小, 线程数等, 所以, 需要给esuser解开资源的束缚;
1.6.1 打开文件的最大数限制;
问题错误信息:
max file descriptors[4096] for elasticsearch process likely too low, increase to at least [65536]
es因为需要大量的创建索引文件, 需要大量的打开系统的文件
sudo vi /etc/security/limits.conf
添加如下内容:
ps: *
不要去掉
..... # 原本的内容
* soft nofile 65535
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
# End of file
修改此文件后, 需要重新登录用户
1.6.2 启动线程数限制
问题错误描述:
max number of threads [1024] for user [esuser] likely too low, increase to at least [4096]
/etc/security/limits.d/20-nproc.conf
* soft nproc 1024
# 修改为:
* soft nproc 4096
1.6.3 调大虚拟内存
问题错误描述
max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least[262144]
手动执行命令:
sudo sysctl -w vm.max_map_count=262144
修改系统文件(重启后不必在修改)
/etc/sysctl.conf
# 最后一行
vm.max_map_count-262144
1.7 启动es
使用esuser
用户来执行
nobup /export/server/es/elasticsearch-xxx/bin/elasticsearch 2> &1 &
使用jps
可以看到es服务进程
访问 http://node1:9200/?pretty
可以看到一些信息
2. 使用Docker
镜像地址: https://hub.docker.com/_/elasticsearch
相关文档: https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docker.html
3. Elasticsearch-head插件
- elasticsearch-head提供一个用于图形化查看的插件工具,
文档网站: http://mobz.github.io/elasticsearch-head/
项目地址: https://github.com/mobz/elasticsearch-head
4. 安装IK分词器
需要使用ES来进行中文分词, 所以要单独给ES安装IK分词器插件:
- 下载ES Ik分词器:
- 切换用户
esuser
, 并在es安装目录下的/plugin
目录下创建ik
目录
mkdir -p /export/server/es/elasticsearch-xxx/plugin/ik
- 将ik分词器解压到该目录下
unzip elasticsearch-analysis-ik-xxx.zip
- 重启ElasticSearch
使用docker启动, 将ik分词器解压到本地;
macOS会在本地的plugin目录中生成一个文件, 会影响es的启动;
注意版本要一致!!!
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -v /docker/elasticsearch/plugin:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" elasticsearch
使用新版的ES需要密码登录: https://blog.csdn.net/u012999325/article/details/105451855
5. 准备Vscode开发环境
在VScode中安装elasticsearch for vscode插件
插件地址: https://marketplace.visualstudio.com/items?itemName=ria.elastic
使用普通的分词器:
POST _analyze
"analyzer": "standard",
"text": "我爱你中国"
结果:
"tokens": [
"token": "我",
"start_offset": 0,
"end_offset": 1,
"type": "<IDEOGRAPHIC>",
"position": 0
,
"token": "爱",
"start_offset": 1,
"end_offset": 2,
"type": "<IDEOGRAPHIC>",
"position": 1
,
"token": "你",
"start_offset": 2,
"end_offset": 3,
"type": "<IDEOGRAPHIC>",
"position": 2
,
"token": "中",
"start_offset": 3,
"end_offset": 4,
"type": "<IDEOGRAPHIC>",
"position": 3
,
"token": "国",
"start_offset": 4,
"end_offset": 5,
"type": "<IDEOGRAPHIC>",
"position": 4
]
使用ik分词器
POST _analyze
"analyzer": "ik_max_word", // 尽可能多的分词
"text": "我爱你中国"
结果:
"tokens": [
"token": "我爱你",
"start_offset": 0,
"end_offset": 3,
"type": "CN_WORD",
"position": 0
,
"token": "爱你",
"start_offset": 1,
"end_offset": 3,
"type": "CN_WORD",
"position": 1
,
"token": "中国",
"start_offset": 3,
"end_offset": 5,
"type": "CN_WORD",
"position": 2
]
以上是关于【ES从入门到实战】十七、全文检索-ElasticSearch-进阶-aggregations聚合分析的主要内容,如果未能解决你的问题,请参考以下文章
五.全文检索ElasticSearch经典入门-ElasticSearch Java实战
八.全文检索ElasticSearch经典入门-深入理解ElasticSearch核心原理
Elastic Search | 记一次Kibana执行ES-DSL脚本实战思考过程