Elasticsearch概述
1.1 Elasticsearch是什么
Elasticsearch 是一个分布式、RESTful风格的搜索和数据分析引擎,包括 Elasticsearch、Kibana、Beats 和 Logstash。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。Elasticsearch 简称 ES,是一个开源的高扩展的分布式全文搜索引擎,是整个 ElasticStack 技术栈的核心。它可以实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
1.2 全文搜索引擎
都是根据网页中的关键字生成索引,匹配到所有的网页进行返回。对于非结构化的数据文本,关系型数据库搜索不是很好的支持。
传统数据库的全文检索实现很不好。因为进行全文检索需要扫描整个表,如果数据量大的话就算对SQL的语法优化,也收效甚微。建立了索引,但是维护麻烦。
在生产环境中,使用常规的搜索方式,性能是非常差的
-
搜索的数据对象是大量的非结构的文本数据。
-
文件记录量达到数十万或数百万个甚至更多。
-
支持大量基于交互式文本的查询。
-
需求非常灵活的全文搜索查询。
-
对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可用满足。
-
对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况
1.3 Elasticsearch And Solr
主流的两款搜索引擎软件:Elasticsearch 和 Solr 都是基于Lucene搭建的,可用独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作:修改、添加、保存、查询等都十分类似。
特征 | Solr/SolrCloud | Elasticesarch |
---|---|---|
社区和开发者 | Apache 软件基金和社区支持 | 单一商业实体及其员工 |
节点发现 | Apache Zookeeper,在大量项目中成熟且经过实战测试 | Zen内置于Elasticsearch本身,需要专用的主节点才能进行分裂脑保护 |
碎片放置 | 本质上是静态,需要手动工作来迁移分片,从Solr 7开始 - Autoscaling API 允许一些动态操作 | 动态,可以根据群集状态按需移动分片 |
高速缓存 | 全局,每个段更改无效 | 每段,更适合动态更改数据 |
分析引擎性能 | 非常适合精确计算的静态数据 | 结果的准确性取决于数据放置 |
全文搜索功能 | 基于Lucene的语言分析,多建议,拼写检查,丰富的高亮显示支持 | 基于Lucene的语言分析,单一建议 API 实现,高亮显示重新计算 |
DevOps支持 | 尚未完全,但即将到来 | 非常好的 API |
非平面数据处理 | 嵌套文档和父-子支持 | 嵌套和对象类型的自然支持允许几乎无限的嵌套和父-子支持 |
查询DSL | JSON(有限),XML(有限)或URL参数 | JSON |
索引/收集领导控制 | 领导者安置控制和领导者重新平衡甚至可以节点上的负载 | 不可能 |
机器学习 | 内置-在流聚合之上,专注于逻辑回归和学习排名贡献模块 | 商业功能,专注于异常和异常值以及及时间序列数据 |
1.4 HTTP操作
-
PUT 请求:创建索引
{
"acknowledged"【响应结果】: true, # true 操作成功
"shards_acknowledged"【分片结果】: true, # 分片操作成功
"index"【索引名称】: "shopping"
}
# 注意:创建索引库的分片数默认 1 片,在 7.0.0 之前的 Elasticsearch 版本中,默认 5 片 -
GET请求:查看所有索引
请求地址:http://127.0.0.1:9200/_cat/indices?v
_cat表示查看的意思,indices表示索引
表头 含义 health 当前服务器健康状态:green(集群完整)yellow(单点正常、集群不完整)red(单点不正常) status 索引打开、关闭状态 index 索引名 uuid 索引统一编号 pri 主分片数量 rep 副本数量 docs.count 可用文档数量 docs.deleted 文档删除状态(逻辑删除) store.size 主分片和副分片整体占空间大小 pri.store.size 主分片占空间大小 -
GET请求:查看单个索引
{
"shopping"【索引名】: {
"aliases"【别名】: {},
"mappings"【映射】: {},
"settings"【设置】: {
"index"【设置 - 索引】: {
"creation_date"【设置 - 索引 - 创建时间】: "1614265373911",
"number_of_shards"【设置 - 索引 - 主分片数量】: "1",
"number_of_replicas"【设置 - 索引 - 副分片数量】: "1",
"uuid"【设置 - 索引 - 唯一标识】: "eI5wemRERTumxGCc1bAk2A",
"version"【设置 - 索引 - 版本】: {
"created": "7080099"
},
"provided_name"【设置 - 索引 - 名称】: "shopping"
}
}
}
}
-
DELETE请求:删除索引
1.5 文档操作
-
POST请求:创建文档
{
"_index"【索引】: "shopping",
"_type"【类型-文档】: "_doc",
"_id"【唯一标识】: "Xhsa2ncBlvF_7lxyCE9G", #可以类比为 MySQL 中的主键,随机生成
"_version"【版本】: 1,
"result"【结果】: "created", #这里的 create 表示创建成功
"_shards"【分片】: {
"total"【分片 - 总数】: 2,
"successful"【分片 - 成功】: 1,
"failed"【分片 - 失败】: 0
},
"_seq_no": 0,
"_primary_term": 1
}
数据创建后,没有指定数据唯一性标识(ID),ES服务器会随机生成一个 -
GET 请求:查看文档
{
"_index"【索引】: "shopping",
"_type"【文档类型】: "_doc",
"_id": "1",
"_version": 2,
"_seq_no": 2,
"_primary_term": 2,
"found"【查询结果】: true, # true 表示查找到,false 表示未查找到
"_source"【文档源信息】: {
"title": "华为手机",
"category": "华为",
"images": "http://www.gulixueyuan.com/hw.jpg",
"price": 4999.00
}
} -
POST请求:修改文档
{
"_index": "shopping",
"_type": "_doc",
"_id": "1",
"_version"【版本】: 2,
"result"【结果】: "updated", # updated 表示数据被更新
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 2
} -
POST请求:修改字段
-
DELETE请求:删除文档
删除一个文档不会立即从磁盘上移除,只是被标记成已删除(逻辑删除)
{
"_index": "shopping",
"_type": "_doc",
"_id": "1",
"_version"【版本】: 4, #对数据的操作,都会更新版本
"result"【结果】: "deleted", # deleted 表示数据被标记为删除
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 2
} -
POST请求:条件删除文档
{
"took"【耗时】: 175,
"timed_out"【是否超时】: false,
"total"【总数】: 2,
"deleted"【删除数量】: 2,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"failures": []
}
1.6 映射操作
-
PUT请求:创建映射
映射数据说明:
1.字段名:任意填写,下面指定许多属性,例如:title、subtitle、images、price
2.type:类型,Elasticsearch 中支持的数据类型非常丰富。
String类型
text:可分词
keyword:不可分词,数据会作为完整字段进行匹配。
Numerical:数值类型
基本数据类型:long、integer、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float
Date:日期类型
Arrat:数组类型
Object:对象
3.index:是否索引,默认为true,也就是说不进行任何配置,所有字段都会被索引。
true:字段会被索引,则可以用来进行搜索。
false:字段不会被索引,不能用来搜索。
4.store:是否将数据进行独立存储,默认为false
原始的文本会存储在_source里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。
5.analyzer:分词器,ik_max_word使用ik分词器。 -
GET请求 查看映射
-
PUT请求:索引映射关联
-
高级查询
{
"took【查询花费时间,单位毫秒】" : 1116,
"timed_out【是否超时】" : false,
"_shards【分片信息】" : {
"total【总数】" : 1,
"successful【成功】" : 1,
"skipped【忽略】" : 0,
"failed【失败】" : 0
},
"hits【搜索命中结果】" : {
"total"【搜索条件匹配的文档总数】: {
"value"【总命中计数的值】: 3,
"relation"【计数规则】: "eq" # eq 表示计数准确, gte 表示计数不准确
},
"max_score【匹配度分值】" : 1.0,
"hits【命中结果集合】" : [
。。。
}
]
}
} -
范围查询
操作符 说明 gt 大于> gte 大于等于>= lt 小于< lte 小于等于<= -
模糊查询
返回包含与搜索字词相似的字词的文档。编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。
-
更改字符(box --> fox)
-
删除字符(black --> lack)
-
插入字符(sic --> sick)
-
转置两个相邻字符(act --> cat)
-
-
单字段排序
sort 可以让我们按照不同的字段进行排序,并且通过 order 指定排序的方式。desc降序,asc升序。
-
高亮排序
进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色。
Elasticsearh 可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。
在使用 match 查询的同时,加上一个 highlight 属性:
-
pre_tags:前置标签
-
post_tags:后置标签
-
fields:需要高亮的字段
-
-
分页查询
from:当前页的起始索引,默认从0开始。
from = (pageNum - 1) * size
size: 每页显示多少条