热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于elasticsearch:搜索引擎Elasticsearch简介实践

之前在寻找日志收集搜寻解决方案时,最常看到的便是ELK:Elasticsearch+Logstash+Kibana计划。只管因为它对服务器资源要求很高转而应用了Loki,但也对它初步钻研过。明天,就对其中的Elasticsearch深刻理解一番。
前言

之前在寻找日志收集搜寻解决方案时,最常看到的便是 ELK:Elasticsearch + Logstash + Kibana 计划。只管因为它对服务器资源要求很高转而应用 了 Loki,但也对它初步钻研过。明天,就对其中的 Elasticsearch 深刻理解一番。

Elasticsearch 介绍

Elasticsearch 是一个开源的搜索引擎,咱们能够用它来解决文本、天文空间(如坐标)、结构化(如 DB 里的表)、非结构化(如报表、图片)等数据,而后通过简略的 REST API 对其搜寻。它的最大特点就在于分布式以及实时速度,可部署到数百甚至上千台服务器上,以便咱们存储解决海量的数据,而且其速度依然能达到秒级。

它的底层应用的是 Apache Lucene。Apache Lucene 是一个高性能、功能强大的搜索引擎库,不过它只是一个库,须要应用 Java 能力集成到应用程序中。因而,Elasticsearch 对其进行了封装,屏蔽了底层的复杂性,对外只提供了简略的 RESTful API。

当 Elasticsearch 接管到像 Logstash 这种工具传输过去的数据后便会以文档的模式去剖析提取索引,压缩数据,按配置的分片规定将数据平均存储。在实现这些后,咱们就能够进行可视化查问了,例如应用 Kibana 面板查看。

因为 Elasticsearch 具备了易用性、实时剖析、全文搜寻、散布部署、高可用等个性,所以除了用来做日志的解决剖析外,还能够利用在平安剖析、指标剖析、性能监控等场景需要。

Elasticsearch 基本概念

文档(Document)

和传统的 DB 不一样,Elasticsearch 不是将数据存储为列式的二维表,而是
采纳 Json 格局存储每一条数据,即文档是以键值对存在的字段汇合。如下就能够是一条文档:

{
    "name":         "John Smith",
    "age":          42
}

咱们也能够把文档了解为根对象,每条文档都会由惟一 \_id 标识它,如果咱们在插入文档时没有指定 \_id,则 Elasticsearch 将会主动生成一个。

索引(Index)

Elasticsearch 之所以能进行实时搜寻,最重要的就在于拿到文档数据后会对 json 里的所有字段建设索引,而且依据字段的不同类型建设不同的索引数据结构,例如 text 类型的字段会建设倒排索引,而数字和天文类型的字段会存储在 BKD 树里。这里重点介绍下倒排索引。

有倒排就有正排,咱们先来看看正排索引,所谓的正排,咱们能够简略的认为间接依据文档 \_id 获取到文档内容,只有你晓得文档 \_id。

文档 \_id 文档内容
1 Elasticsearch 简介
2 Elasticsearch 实际

而倒排索引就不一样了,它会依据字段的内容进行分词提取出多个单词,而后依据单词建设起和文档 \_id 的关联关系。后续就能够通过单词 -> 文档 \_id -> 文档内容来搜寻了。

单词 文档 \_id
Elasticsearch 1, 2
简介 1
实际 2

实际上像上述表格的第一列里的单词被称之为 term,而第二列被称之为 Posting List。在 Elasticsearch 里会对 term 进行优化以便疾速寻找,同时还会其进行压缩,以缩小存储空间。

映射类型(Mapping Types)

当文档被创立时,每个文档都会存储在一个独自的索引中,并且配以一个映射类型,以示意其文档类型,例如 twitter 索引可领有 user 类型和 tweet 类型。

每个映射类型都能够有本人的字段,例如 user 类型能够有一个 full_name 、user_name、email 字段,而 tweet 类型能够有 content 、user_name、tweeted_at 字段。

实际上,user_name 字段在这两个映射类型里是共用存储的,这意味着,这个字段只能以一种数据类型而存在。如果咱们想让 user 类型的 user_name 是 string 类型,想让
tweet 类型的 user_name 是 boolean 类型,是办不到的。

而且映射类型多了还会导致数据稠密烦扰 Lucene 的压缩文档能力。因而在 Elasticsearch 6.x 版本里只容许一个索引蕴含一个映射类型,在 7.x 版本里映射类型的概念则已被移除,变成 _doc 固定类型。

集群(Cluster)、节点(Node)

一个 ElasticSearch 实例称之为节点,当有多个实例节点一起协同工作时便称之为集群

分片(Shard)

ElasticSearch 解决的数据是十分大的,为了缩小单个实例的压力,会将数据平衡的存储在各个节点上,而一个分片就是一个底层的工作单元,它保留了全副数据中的一部分。当咱们集群扩容或放大时,Elasticsearch 会主动的在各节点中迁徙分片,使得数据依然均匀分布在集群里。

一个分片能够是主分片或者是正本分片,正本分片其实就是主分片的拷贝,即所谓的冗余备份,避免硬件故障数据失落。

ElasticSearch 装置

应用 docker 装置将非常简单,咱们只须要拉取镜像:

docker pull elasticsearch:7.2.0

而后启动:

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d elasticsearch:7.2.0

验证是否装置胜利:

curl http://localhost:9200
ElasticSearch 应用

ElasticSearch 提供了敌对的 API 接口供内部应用。所以,当咱们想往 ElasticSearch 输出数据、搜寻数据便能够通过 HTTP + JSON 的形式进行。甚至咱们能够间接应用 curl 命令来和 ElasticSearch 交互,例如统计文档数量:

curl -XGET 'http://localhost:9200/_count?pretty' -d '
{
    "query": {
        "match_all": {}
    }
}
'

在接管到申请,Elasticsearch 解决实现后将会返回一个 HTTP 状态码(例如:200 OK)和一个 JSON 格局的返回值,例如:

{
    "count" : 0,
    "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
    }
}

为了书写方面,前面的申请将以简略模式出现,不再形容所有雷同的局部:主机名、端口号以及 curl 命令自身。例如以下简略格局:

GET /_count
{
    "query": {
        "match_all": {}
    }
}

事实上,如果咱们应用 kibana 的控制面板,就会发现它就是这么要求命令输出的。另外,ElasticSearch 的版本有很多,有的版本差别将十分大,上面的应用都是是针对 7.20 版本的,请知悉。

创立

文档的创立须要指定三个元数据:\_index(文档的归集所在)、\_type(文档的归类)、\_id(文档的惟一标识)。其中,\_index 是一个逻辑上的命名空间,示意具备雷同个性的文档汇合,这个汇合将会依据所有字段进行优化索引,在底层存储上则会被散发解决。

须要留神的是,因为 7.x 版本后的 _type 曾经固定为 _doc 了,所以如果咱们想要创立文档的话,能够这么发送命令:

POST my-index-000001/_doc/
{
  "@timestamp": "2099-11-15T13:12:00",
  "message": "GET /search HTTP/1.1 200 1070000",
  "user": {
    "id": "kimchy"
  }
}

此时,ElasticSearch 将会响应:

{
  "_shards": {
    "total": 2,
    "failed": 0,
    "successful": 2
  },
  "_index": "my-index-000001",
   "_type": "_doc",
  "_id": "W0tpsmIBdwcYyG50zbta",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "result": "created"
}

能够看到 ElasticSearch 将为咱们主动生成了 _id 字段,如果咱们的程序领有本人的标识字段,那么能够本人定义 _id 的值:

PUT /my-index-000001/_doc/1
{
  "@timestamp": "2099-11-15T13:12:00",
  "message": "GET /search HTTP/1.1 200 1070000",
  "user": {
    "id": "kimchy"
  }
}

返回如下:

{
  "_shards": {
    "total": 2,
    "failed": 0,
    "successful": 2
  },
  "_index": "my-index-000001",
   "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "result": "created"
}

这样的话,如果咱们晓得文档 _id,那么就也这样获取数据了:

获取

GET /my-index-000001/_doc/1

将返回如下:

{
  "_index": "my-index-000001",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "_seq_no": 0,
  "_primary_term": 1,
  "found": true,
  "_source": {
      "@timestamp": "2099-11-15T13:12:00",
      "message": "GET /search HTTP/1.1 200 1070000",
      "user": {
        "id": "kimchy"
      }
    }
}

搜寻

当然,大多数时候咱们是不晓得文档 id 具体值的,所以咱们得用上面 _search 来搜寻:

GET /my-index-000001/_search?q=1.1

其中,q 示意查问任一字段蕴含 1.1 的记录。

如果咱们想要更加功能丰富的查问,那么咱们能够生成一个残缺的 body 发送过来:

{
    "query": {
        "match" : {
            "message" : "1.1"
        }
    },
    "size": 2,
    "_source": [ "message", "user" ],
}

下面示意查问 2 条记录,并且只返回字段 messageuser

更新

如果咱们想要更新文档的话,能够应用上面命令:

POST //_update/<_id>

删除

如果咱们想要删除文档的话,能够应用上面命令:

DELETE //_doc/<_id>

对于更多 API 命令大伙能够查看下官网的 API :REST APIs

总结

优良的开源框架总是能以敌对的产品状态面向开发者,毫无疑问,Elasticsearch 就具备了这个个性。它屏蔽了底层简单的逻辑概念,对外只裸露了简略易用的 API。让咱们的程序能疾速集成、疾速利用,或者这就是一个开源框架被宽泛应用的基操吧!


感兴趣的敌人能够搜一搜公众号「 阅新技术 」,关注更多的推送文章。
能够的话,就顺便点个赞、留个言、分享下,感激各位反对!
阅新技术,浏览更多的新常识。


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
author-avatar
来去匆匆4_362
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有