本篇文章对 Elasticsearch 做了基本介绍,在后续将通过专栏的方式持续更新,本系列以 Elasticsearch7 作为主要的讲解版本,欢迎各位大佬指正,共同学习进步!

一般涉及大型数据库的电子商务和搜索引擎的产品都面临这样一个问题,产品信息检索花费时间太长。这不良的用户体验,可能导致失去潜在的客户。这种滞后搜索归因于产品设计所使用到关系数据库,数据分散在多个表中,关系型数据处理这些表中数据获取搜索结果时工作速度是远远不能瞒足。可以说,现在的企业正在寻找数据存储的替代品,以期促进快速检索,而 Elasticsearch(ES)的出现很好解决这些问题。

1、什么是 Elasticsearch?

Elasticsearch 是基于 Lucene 的搜索引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful Web接口。

换句话说,Elasticsearch 是用 Java 开发的开源,独立数据库服务器。基本上,它用于全文搜索和分析。它从各种来源获取数据,并将其存储为针对搜索进行了高度优化的复杂格式。如上所述,Elasticsearch 将 Apache Lucene 作为搜索的核心。由于 Lucene 只是一个库,使用起来有一定难度。但是你不必担心,Elasticsearch 对搜索引擎操作都进行封装 ,可以通过使用对应的 Restful 的 API 进行操作。使用 Elasticsearch 可以快速有效地存储,搜索和分析大量数据,而且在处理半结构化数据(即自然语言)时特别有用。

2、Elasticsearch 能做什么?

平时我们在 GitHub 上进行搜索的时候,Github 不仅可以帮我们找到相隔的代码产库,还可以帮助实现代码级的搜索及搜索词的高亮的显示,。当你在网上购物的时候,它也可以帮助你做商品的推荐。当你下班的时候,Elasticsearch 可以帮助你定位附件的乘客和司机,帮助平台优化调度,除了搜索,结合 Kibana、Logstash、Beats 的 ELK(Elastic Stack) 还被广泛使用在大数据近实时分析的领域,包括了日志分析、指标监控、信息安全等多个领域,它可以帮助你探索海量的、结构化的、非结构化的数据,按需创建是可视化报表,对监控数据设置报警阀值。

3、Elasticsearch 5、6、7版本特性史

V5.x

  • Lucene 6.x,
  • 性能提升,默认打分机制从 TF-IDF 改为 BM 25
  • 支持 Ingest 节点、 Completion suggested 、Java REST 客户端
  • Type 标记成 deprecated,支持了 Keyword 的类型
  • 性能优化
    • 减少了内部争竞争,防止对同一文档进行并发更新的竞争以及在同步事务日志时减少了锁定要求,索引吞吐量已得到了极大的提高
    • Instant Aggregations,在 Shard 层面提供了 Aggregation 缓存
    • 新增了 Profile API

V6.x

  • Lucene 7.x
  • Removal of types,在 6.0 里面,开始不支持一个 index 里面存在多个 type
  • 跨多个Elasticsearch集群搜索,保留原来的索引在 5.x 群集,跨群集搜索来同时搜索 6.x 和 5.x 群集
  • 跨群集复制(CCR)
  • 更友好的的升级及数据迁移,在主要版本之间的迁移更为简化,体验升级
  • 性能优化
    • 稀疏区域改进,降低了存储成本
    • 通过索引排序,可加快排序的查询性能

V7.x

  • Lucene 8.0
  • 重大改进-正式废除单个索引下多 Type 的支持
  • 7.1开始,Security 功能免费使用
  • ECK,允许用户在 Kubernetes 上配置,管理和操作 Elasticsearch 集群
  • TransportClient 被废弃

    以至于,ES7 的 Java 代码,只能使用 restclient
  • 新功能
    • 新的集群协调
    • 功能更完善的 REST Client
    • Script Score Query,下一代的评分方式
  • 性能优化
    • 默认的 Primary Shard 数从 5 改为 1,避免 Over Sharding
    • 性能优化,更快的 Top K 检索

4、Elasticsearch 基本概念

要了解 Elasticsearch ,首先要先了解下面的几个专有名词,索引(Index)、文档( Document)、类型(Type)

索引(Index)

  • Index 一索引是文档的容器,是一类文档的结合

    • Index 体现了逻辑空间的概念:每个索引都有自己的 Mapping,用于定义包含的文档的字段名和字段类型
    • Shard 体现了物理空间的概念:索引中的数据分散在 Shard 上
  • 索引的 Mapping 与 Settings
    • Mapping 定义文档字段的类型
    • Setting 定义不同的数据分布

定义不同的数据分布

{
"movies" : {
"settings" : {
"index" : {
"creation_date" : "1570452552",
"number_of_shards" : "5",
"number_of_replicas" : "1",
"uuid" : "pB0UsxjfQT2fW-s8Uy-Nsg",
"version" : {
"created" : "2030599"
}
}
}
}
}

定义文档字段的类型

{
"movie": {
"mappings": {
"doc": {
"properties": {
"songName": {
"type": "text"
},
"singer": {
"type": "text"
},
"price": {
"type": "integer"
}
}
}
}
}
}

索引有不同语义,在 ES 中指的是在集群中创建的索引(名词),也可以指的是文档到 ES 的过程(动词),即是一次倒排索引的过程。而在其他地方看到索引更多表示 B 树索引或者倒排索引。

文档( Document)

  • Elasticsearch 是面向文档的,文档是所有可搜索数据的最小单位

    • 日志文件中的日志项
    • 一本电影的具体信息
    • 一首歌的详细信息
  • 文档会被序列化成 JSON 格式,保存在 Elasticsearch 中
    • JSON 对象由字段组成,
    • 每个字段都有对应的字段类型(字符串/数值/布尔/日期/二进制/范围类型)
  • 每个文档都有一个 Unique ID
    • 可以自己指定 ID 或者通过 Elasticsearch 自动生成

案例

{
"songName" : "说好不哭",
"singer" : "周杰伦",
"price" : 3
}

文档的元数据

{
"_index" : "song",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"songName" : "说好不哭",
"singer" : "周杰伦",
"price" : 3
}
}
  • 元数据,用于标注文档的相关信息

    • _index :文档所属的索引名
    • _type :文档所属的类型名
    • _id :文档唯一 Id
    • _source:文档的原始 JSON 数据
    • _all:整合所有字段内容到该字段,已被废除
    • _version:文档的版本信息
    • _score:相关性打分

类型(Type)

  • 在 7.0 之前,一个 Index 可以设置多个 Types
  • 6.0 开始, Type 已经被 Deprecated。7.0 开始一个索引,只能创建一个 Type -"_doc"。

5、RDBMS VS Elasticsearch

下面是 RDBMS 和 Elasticsearch 一个不是很恰当类比,Elasticsearch 集群可以包含多个索引 Indes(数据库),每一个索引可以包含一个doc类型 Type(表),每一个类型包含多个文档 Document(记录),然后每个文档包含多个字段 Fields(列),DSL 相当于 RDBMS 的 SQL。

RDBMS Elasticsearch
Schema Mapping
Table Index(Type)
Column Filed
Row Document
SQL DSL

6、小结

与传统 SQL 数据库管理系统(其花费10秒钟以上的时间来获取所需的搜索查询数据)相比,Elasticsearch 可以在10毫秒内完成此操作。由于 Elasticsearch 具有分布式架构,因此它可以扩展到数千个服务器并容纳PB级的数据。我们不必管理分布式设计的复杂性,因为 ES 已经自动完成。我们有多种方法可以为一些文档建立索引或查询它们,然而在使用 ES 下,我们可以轻松实现在海量数据快速检索全文,得到我们想要的结果。

【Elasticsearch 搜索之路】(一)什么是 Elasticsearch?的更多相关文章

  1. ElasticStack学习(六):ElasticSearch搜索初探

    一.ElasticSearch搜索介绍 1.ElasticSearch搜索方式主要分为以下两种: 1).URI Search:此种查询主要是使用Http的Get方法,在URL中使用查询参数进行查询: ...

  2. 基于Elasticsearch搜索平台设计

    背景 随着公司业务的高速发展以及数据爆炸式的增长,当前公司各产线都有关于搜索方面的需求,但是以前的搜索服务系统由于架构与业务上的设计,不能很好的满足各个业务线的期望,主要体现下面三个问题: 不能支持对 ...

  3. 一次 ElasticSearch 搜索优化

    一次 ElasticSearch 搜索优化 1. 环境 ES6.3.2,索引名称 user_v1,5个主分片,每个分片一个副本.分片基本都在11GB左右,GET _cat/shards/user 一共 ...

  4. elasticsearch搜索框架的安装相关

    安装JAVA SE 百度一下JAVA SE,按照自己的平台,位数选择就是了, 这里遇到过一个坑,双击exe安装包一直无法打开jdk的安装,在任务管理器里面就一闪而过, 后来我卸载了所有JAVA的相关安 ...

  5. ElasticSearch搜索解析

    这篇介绍稍多,篇幅可能有点多,下面会针对一些重要的点做一些小测试 搜索返回文档解析 hits搜索返回的结果中最重要的一部分其中包含了 索引信息(_index,_type,_index,_source, ...

  6. ElasticSearch搜索介绍四

    ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, &quo ...

  7. Elasticsearch搜索结果返回不一致问题

    一.背景 这周在使用Elasticsearch搜索的时候遇到一个,对于同一个搜索请求,会出现top50返回结果和排序不一致的问题.那么为什么会出现这样的问题? 后来通过百度和google,发现这是因为 ...

  8. Elasticsearch搜索调优权威指南 (2/3)

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/AAkVdzmkgdBisuQZldsnvg 英文原文:https://qbox.io/blog/el ...

  9. Elasticsearch搜索调优权威指南 (1/3)

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/qwkZKLb_ghmlwrqMkqlb7Q英文原文:https://qbox.io/blog/ela ...

随机推荐

  1. POJ2723 Get Luffy Out解题报告tarjan+2-SAT+二分

    今天看到讲2-SAT比较好的blog,感觉微微的理解了2-SAT 传送门 参考: https://blog.csdn.net/leolin_/article/details/6680144 题意:你有 ...

  2. I don't Blame You that You don't Understand Me

    I don't Blame You that You don't Understand Me Every one has a dead corner in himself, with no entry ...

  3. Vue之render渲染函数和JSX的应用

    一.模板缺陷 模板的最大特点是扩展难度大,不易扩展.可能会造成逻辑冗余 <Level :type="1">哈哈</Level> <Level :typ ...

  4. Spring源码分析之-加载IOC容器

    本文接上一篇文章 SpringIOC 源码,控制反转前的处理(https://mp.weixin.qq.com/s/9RbVP2ZQVx9-vKngqndW1w) 继续进行下面的分析 首先贴出 Spr ...

  5. springboot过滤器的实现

    springboot过滤器的实现 如下所示: import javax.servlet.*; import javax.servlet.annotation.WebFilter;import java ...

  6. TensorFlow读取数据的三种方法

    tensortlfow数据读取有三种方式 placehold feed_dict:从内存中读取数据,占位符填充数据 queue队列:从硬盘读取数据 Dataset:同时支持内存和硬盘读取数据 plac ...

  7. 作为一名Android开发者,你有过迷茫吗?

    前言 经常听新进的小白问道,Android是不是饱和了?想写一篇关于Android开发者忧虑的文章很久了,今天才提起勇气写.最近不管是在微信.QQ群,还是在各大博客网站,都随处听得到Android开发 ...

  8. 学习数据库SQL语句1

    数据库一直让我很头大,正好出差有空,就重新恶补起来吧!(网站:http://www.w3school.com.cn/sql) 我准备把我每天学到的都记录下来=.= (红色字体代表关键词,蓝色字体是我个 ...

  9. Elasticsearch(8) --- 聚合查询(Metric聚合)

    Elasticsearch(8) --- 聚合查询(Metric聚合) 在Mysql中,我们可以获取一组数据的 最大值(Max).最小值(Min).同样我们能够对这组数据进行 分组(Group).那么 ...

  10. charles 外部代理设置

    本文参考:charles 外部代理设置 external proxy 外部代理设置 有时候您可能需要使用网络上的代理服务器才能访问Internet. 在这种情况下,您需要为Charles配置外部代理. ...