ElasticSearch 一文读懂
Posted 在奋斗的大道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch 一文读懂相关的知识,希望对你有一定的参考价值。
目录
2.1 使用Docker安装ElasticSearch7.6.2
2.3 使用Docker安装elasticSearch--head
通过Chrome 插件安装ElasticSearch-head
实现方式二:使用should+bool搜索,控制搜索条件的匹配度。
基于dis_max实现best fields策略进行多字段搜索
使用multi_match简化dis_max+tie_breaker
1、Elasticsearch 简介
Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。[5]根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
2、Docker 安装 Elasticsearch
Elasticsearch 的发展是非常快速的,所以在 ES5.0 之前, ELK 的各个版本都不统一,出现了版本号混乱的状态,所以 从5.0 开始,所有 Elastic Stack 中的项目全部统一版本号。目前最新版本是8.3.2 ,我们将基于这Elasticsearch7.6.2版本进行学习。2.1 使用Docker安装ElasticSearch7.6.2
# elasticsearch 镜像检索
docker search elasticsearch
# 下载elasticsearch 指定版本7.6.2
docker pull elasticsearch:7.6.2
# 创建elasticsearch 容器挂载目录地址(配置文件、数据和插件)
mkdir -p /usr/local/es/config /usr/local/es/data /usr/local/es/plugins
# 简单运行elasticsearch 容器
docker run -d \\
--name elasticsearch \\
-p 9200:9200 -p 9300:9300 \\
-e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" \\
elasticsearch:7.6.2
# 拷贝elasticsearch 容器中的配置文件
docker cp elasticsearch:/usr/share/elasticsearch/config /usr/local/es
docker cp elasticsearch:/usr/share/elasticsearch/data /usr/local/es
docker cp elasticsearch:/usr/share/elasticsearch/plugins /usr/local/es
# 通过SFTP将下载的IK插件上传至/usr/local/es/plugins 目录下。
[root@localhost plugins]# ls -a
. .. elasticsearch-analysis-ik-7.6.2
# 修改jvm 运行参数
[root@localhost plugins]# vim /usr/local/es/config/jvm.options
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms64m
-Xmx512m
# 解决跨越配置
[root@localhost plugins]# vim /usr/local/es/config/elasticsearch.yml
添加如下代码片段
http.cors.enabled: true
http.cors.allow-origin: "*"
# 移除简单elasticsearch 容器
[root@localhost plugins]# docker rm -f elasticsearch
elasticsearch
# 再重新启动挂卷elasticsearch 容器实例
[root@localhost config]# docker run -d \\
> --name elasticsearch \\
> -p 9200:9200 -p 9300:9300 \\
> -e "discovery.type=single-node" \\
> -v /usr/local/es/config:/usr/share/elasticsearch/config \\
> -v /usr/local/es/data:/usr/share/elasticsearch/data \\
> -v /usr/local/es/plugins:/usr/share/elasticsearch/plugins \\
> elasticsearch:7.6.2
# 检查elasticsearch 服务是否正常启动
[root@localhost config]# curl http://localhost:9200
"name" : "0f6f368c4c1d",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "B_p4MWplSiO2cNp3EE9AOg",
"version" :
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
,
"tagline" : "You Know, for Search"
MobaXterm 实际操作:
# 查看本地镜像资源
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 3 weeks ago 142MB
mysql 5.7 2a0961b7de03 3 weeks ago 462MB
delron/fastdfs latest 8487e86fc6ee 4 years ago 464MB
# 检索elasticsearch 镜像资源
[root@localhost docker]# docker search elasticsearch
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
elasticsearch Elasticsearch is a powerful open source sear… 5665 [OK]
kibana Kibana gives shape to any kind of data — str… 2421 [OK]
bitnami/elasticsearch Bitnami Docker Image for Elasticsearch 54 [OK]
bitnami/elasticsearch-exporter Bitnami Elasticsearch Exporter Docker Image 4 [OK]
# 下载elasticsearch 镜像资源指定版本7.6.2
[root@localhost docker]# docker pull elasticsearch:7.6.2
7.6.2: Pulling from library/elasticsearch
ab5ef0e58194: Pull complete
c4d1ca5c8a25: Pull complete
941a3cc8e7b8: Pull complete
43ec483d9618: Pull complete
c486fd200684: Pull complete
1b960df074b2: Pull complete
1719d48d6823: Pull complete
Digest: sha256:1b09dbd93085a1e7bca34830e77d2981521a7210e11f11eda997add1c12711fa
Status: Downloaded newer image for elasticsearch:7.6.2
# 创建elasticsearch 容器挂载宿主主机文件目录创建
[root@localhost docker]# mkdir -p /usr/local/es/config /usr/local/es/data /usr/local/es/plugins
[root@localhost docker]# cd /usr/local/es
[root@localhost es]# ls -al
总用量 0
drwxr-xr-x. 5 root root 47 6月 21 16:29 .
drwxr-xr-x. 16 root root 192 6月 21 16:29 ..
drwxr-xr-x. 2 root root 6 6月 21 16:29 config
drwxr-xr-x. 2 root root 6 6月 21 16:29 data
drwxr-xr-x. 2 root root 6 6月 21 16:29 plugins
# 简单运行elasticsearch 容器,为了拷贝elasticsearch 容器相关配置文件
[root@localhost es]# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# 进入elasticsearch 容器,下载IK 分词插件
[root@localhost es]# docker exec -it elasticsearch /bin/bash
[root@93e38d04a341 elasticsearch]
# 温馨提示:es 从 v5.5.1 版本开始支持自带的 es 插件命令来安装。
[root@93e38d04a341 elasticsearch]#./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
-> Installing https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
-> Downloading https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
-> Failed installing https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
-> Rolling back https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
-> Rolled back https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
Exception in thread "main" java.net.UnknownHostException: github.com
at java.base/sun.nio.ch.NiosocketImpl.connect(NioSocketImpl.java:567)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:339)
at java.base/java.net.Socket.connect(Socket.java:603)
无法解析github.com网站,导致elasticsearch-analysis-ik-7.6.2.zip 指定资源无法下载。
解决办法:宿主主机下载elasticsearch-analysis-ik-7.6.2.zip 压缩包,解压压缩包并上传宿主主机的 /usr/local/es/plugins 文件目录下。
# 退出elasticsearch 容器
[root@93e38d04a341 elasticsearch]# exit
exit
# 拷贝elasticsearch 容器配置文件
[root@localhost ~]# docker cp elasticsearch:/usr/share/elasticsearch/config /usr/local/es
[root@localhost ~]# docker cp elasticsearch:/usr/share/elasticsearch/data /usr/local/es
[root@localhost ~]# docker cp elasticsearch:/usr/share/elasticsearch/plugins /usr/local/es
#编辑jvm.option
[root@localhost config]# vim jvm.options
#编辑elasticsearch.yml
[root@localhost config]# vim elasticsearch.yml
#移除简单elasticsearch 容器
[root@localhost plugins]# docker rm -f elasticsearch
elasticsearch
#重新 启动elasticsearch 容器
[root@localhost config]# docker run -d \\
> --name elasticsearch \\
> -p 9200:9200 -p 9300:9300 \\
> -e "discovery.type=single-node" \\
> -v /usr/local/es/config:/usr/share/elasticsearch/config \\
> -v /usr/local/es/data:/usr/share/elasticsearch/data \\
> -v /usr/local/es/plugins:/usr/share/elasticsearch/plugins \\
> elasticsearch:7.6.2
0f6f368c4c1d57046f9476bfe63a436c4ee153a4bc677be774a6b0145cf33881
[root@localhost config]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f6f368c4c1d elasticsearch:7.6.2 "/usr/local/bin/dock…" 4 seconds ago Up 3 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch
#验证elasticsearch 服务是否正常
[root@localhost config]# curl http://localhost:9200
"name" : "0f6f368c4c1d",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "B_p4MWplSiO2cNp3EE9AOg",
"version" :
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
,
"tagline" : "You Know, for Search"
2.2Elasticsearch 目录详解
ElasticSearch 官网地址:https://www.elastic.co
下载ElasticSearch-7.6.2.zip 包,解压至当前文件目录
目录文件说明:
bin: 启动命令
config: 配置文件
log4j2: 日志配置文件
jvm.options: Java虚拟机 相关配置
elasticsearch.yml: elasticsearch 配置文件
lib: 依赖的相关jar包
log: 日志输出
modules:功能模块
plugins: 插件存放位置,如IK
2.3 使用Docker安装elasticSearch--head
由于 ES 官方并没有为 ES 提供界面管理工具,仅仅是提供了后台的服务。 elasticsearch-head 是一个为 ES 开发的一个 页面客户端工具,其源码托管于GitHub ,地址为: https://github.com/mobz/elasticsearch-head head 提供了 4 种安装方式:- 源码安装,通过npm run start启动(不推荐)
- 通过docker安装(推荐)
- 通过chrome插件安装(推荐)
- 通过ES的plugin方式安装(不推荐)
通过Chrome 插件安装ElasticSearch-head
ElasticSearch-Head 插件安装后的效果:
启动ElasticSearch-Head 插件,连接ElasticSearch 服务。
启动ElasticSearch-Head 插件后, 插件默认首页。
点击New 按钮,添加ElasticSearch 服务的IP地址。
至此,ElasticSearch-Head 插件安装成功,并成功连接ElasticSearch 服务。
ElasticSearch-Head 之Google 插件下载地址:
2.4 了解ELK
ELK 是ElasticSearch、Logstash、Kibana 三大开源框架首字母。市面上也被称为Elastic Stack。其中ElasticSearch 是一个基于Lucene、分布式、通过Restful方式进行交互的近实时检索平台框架。Logstash 是ELK的中央数据流引擎,用于从不同的目标(文件/数据 存储/MQ)收集不同格式的数据,经过过滤后支持输出到不同的目的地(文件/MQ/Redis/ElasticSearch/KaKa等)。Kibana 可以将ElasticSearch 的数据通过友好的页面展示出来,提供实时分析的功能。
ELK 功能结构图
Docker 安装Kibana
1、下载Kibana
# 检索Kibana 镜像
docker search kibana
# 下载Kibana 镜像指定版本7.4.1
docker pull kibana:7.4.1
# 查看本地镜像资源
docker images
2、编辑kibana的配置文件kibana.yml
在宿主主机上 创建/usr/local/kibana/conf 文件目录用于存放kibana.yml 配置文件。
mkdir -p /usr/local/kibana/conf
编辑kibana.yml 文件内容如下:
# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://192.168.43.10:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
注意:elasticsearch.hosts为Elasticsearch实例。
3、运行 Kibana
# Kibana 运行命令
docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name es-kibana -p 5601:5601 -v /usr/local/kibana/conf/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.4.1
# 查看容器启动状态
docker ps
4、运行Kibana 效果截图
访问 http://192.168.43.10:5601 (启动可能会较慢,如失败等几秒再尝试刷新一下)
3 ElasticSearch 核心概念
3.1索引 index
一个索引就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户数据 的索引,另一个产品目录的索引,还有一个订单数据的索引。 一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这 个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。3.2 映射 mapping
ElasticSearch中的映射(Mapping)用来定义一个文档。 mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认 值、分词器、是否被索引等等,这些都是映射里面可以设置的3.3 字段Field
相当于是数据表的字段|列3.4 字段类型 Type
每一个字段都应该有一个对应的类型,例如:Text、Keyword、Byte等3.5 文档 document
一个文档是一个可被索引的基础信息单元,类似一条记录。文档以JSON( javascript Object Notation)格式来表示;3.6 集群 cluster
一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提 供索引和搜索功能。3.7 节点 node
一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索 引和搜索功能 一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每 个节点都会被安排加入到一个叫做“elasticsearch”的集群中 这意味着,如果在网络中启动了若干个节点,并假定它们能够相互发现彼此,它们 将会自动地形成并加入到一个叫做“elasticsearch”的集群中 在一个集群里,可以拥有任意多个节点。而且,如果当前网络中没有运行任何 Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫 做“elasticsearch”的集群3.8 分片和副本 shards&replicas
分片
- 一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10 亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或 者单个节点处理搜索请求,响应太慢。
- 为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些 份就叫做分片。
- 当创建一个索引的时候,可以指定你想要的分片的数量。
- 每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以 被放置到集群中的任何节点上。
- 分片很重要,主要有两方面的原因
- 允许水平分割/扩展你的内容容量
- 允许在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量
- 至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由 Elasticsearch管理的,对于作为用户来说,这些都是透明的
副本
在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎 么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转 移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分 片的一份或多份拷贝,这些拷贝叫做副本分片,或者直接叫副本
副本之所以重要,有两个主要原因
1) 在分片/节点失败的情况下,提供了高可用性。 注意到复制分片从不与原/主要(original/primary)分片置于同一节点 上是非常重要的
2) 扩展搜索量/吞吐量,因为搜索可以在所有的副本上并行运行
每个索引可以被分成多个分片。一个索引有0个或者多个副本。
一旦设置了副本,每个索引就有了主分片和副本分片,分片和副本的数 量可以在索引创建的时候指定
在索引创建之后,可以在任何时候动态地改变副本的数量,但是不能改变 分片的数量
ElasticSearch 分词原理之倒排索引
ElasticSearch 集成IK分词
# 首先官网下载elasticsearch-analysis-ik-7.6.2 分词
官网地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
# 将elasticsearch-analysis-ik-7.6.2 解压文件目录,通过ftp/sftps上传至es plugin挂载卷地址
/usr/local/es/plugins
[root@localhost plugins]# pwd
/usr/local/es/plugins
[root@localhost plugins]# ls -al
总用量 0
drwxr-xr-x. 3 root root 45 6月 21 17:09 .
drwxr-xr-x. 5 root root 47 6月 21 16:29 ..
drwxr-xr-x. 3 root root 243 6月 21 17:09 elasticsearch-analysis-ik-7.6.2
# 重新启动elasticSearch 容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f6f368c4c1d elasticsearch:7.6.2 "/usr/local/bin/dock…" 40 hours ago Up 40 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch
[root@localhost ~]# docker restart 0f6f368
0f6f368
IK分词效果:
4、ElasticSearch 数据管理
ES是面向文档(document oriented)的 ,这意味着它可以存储整个对象或文档 (document)。 然而它不仅仅是存储,还会使用索引(index)每个文档的内容使之可以被搜索。 在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。 ES使用 JSON 作为文档序列化格式。 JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。 ES存储的一个员工文档的格式示例:
"email": "zhouzhiwengang@163.com",
"name": "周志文",
"age": 30,
"interests": ["厨艺", "阅读"]
4.1 ElasticSearch 基本操作
1) 创建索引
语法格式: PUT /索引名称 举例 : PUT / es_db2) 查询索引
语法格式: GET /索引名称 举例 : GET / es_db3) 删除索引
语法格式: DELETE /索引名称 1 举例 : DELETE / es_db4) 添加文档
语法格式: PUT /索引名称/类型/idPUT http://192.168.43.10:9200/es_db/_doc/1
"email": "zhouzhiwen@163.com",
"name": "周志文",
"age": 30,
"interests": ["厨艺", "阅读"]
PUT http://192.168.43.10:9200/es_db/_doc/2
"email": "zhouzhiwenxiong@163.com",
"name": "周志雄",
"age": 30,
"interests": ["游戏"]
PUT http://192.168.43.10:9200/es_db/_doc/3
"email": "zhouzhiwengang@163.com",
"name": "周志刚",
"age": 30,
"interests": ["登山","美食"]
5) 修改文档
格式 : PUT / 索引名称 / 类型 / idPUT http://192.168.43.10:9200/es_db/_doc/3
"email": "zhouzhiwengang@163.com",
"name": "周志刚修改",
"age": 29,
"interests": ["编程","美食"]
6) 查询文档
格式 : GET / 索引名称 / 类型 / idGET http://192.168.43.10:9200/es_db/_doc/3
7) 删除文档
格式 : DELETE / 索引名称 / 类型 / idDELETE http://192.168.43.10:9200/es_db/_doc/3
8) 查询操作
8.1 查询当前类型中的所有文档 _search
格式 : GET / 索引名称 / 类型 / _searchGET http://192.168.43.10:9200/es_db/_doc/_search
8.2 条件查询, 如要查询age等于30岁的 _search?q=*:***
格式 : GET / 索引名称 / 类型 / _search ? q =* : ***GET http://192.168.43.10:9200/es_db/_doc/_search?q=age:30
8.3 范围查询, 如要查询age在25至26岁之间的 _search?q=***[** TO **] 注意: TO 必须为大写
格式 : GET / 索引名称 / 类型 / _search ? q =*** [ 25 TO 26 ] 8.4 根据多个ID进行批量查询 _mget 格式 : POST / 索引名称 / 类型 / _mgetPOST http://192.168.43.10:9200/es_db/_doc/_mget
"ids": [1, 2]
8.5 查询年龄小于等于28岁的 :<=
格式 : GET / 索引名称 / 类型 / _search ? q = age : <=**GET http://192.168.43.10:9200/es_db/_doc/_search?q=age:<=28
8.6 查询年龄大于28前的 :>=
格式 : GET / 索引名称 / 类型 / _search ? q = age : >=**GET http://192.168.43.10:9200/es_db/_doc/_search?q=age:>=28
8.7 分页查询 from=*&size=*
格式
:
GET
/
索引名称
/
类型
/
_search
?q=age:>=28&
from
=
0
&
size
=
1
GET http://192.168.43.10:9200/es_db/_doc/_search?q=age:>=28&from=0&size=1
8.8 对查询结果只输出某些字段 _source=字段,字段
格式 : GET / 索引名称 / 类型 / _search ? _source = 字段 , 字段GET http://192.168.43.10:9200/es_db/_doc/_search?_source=name
8.9 对查询结果排序 sort=字段:desc/asc
格式 : GET / 索引名称 / 类型 / _search ? sort = 字段: deschttp://192.168.43.10:9200/es_db/_doc/_search?sort=age:desc
9) 文档批量操作
多个文档是指,批量操作多个文档。
9.1 批量获取文档数据
说明:批量获取文档数据是通过_mget的API来实现的 。格式: POST /索引名称/类型/_mget
POST http://192.168.43.10:9200/es_db/_doc/_mget
"ids":[1, 2]
9.2 批量操作文档数据
说明:批量对文档进行写操作是通过_bulk的API来实现的。 格式: POST / _bulk以上是关于ElasticSearch 一文读懂的主要内容,如果未能解决你的问题,请参考以下文章