ElasticSearch7.6.x 学习笔记

目录

ElasticSearch概述

ElasticSearch,简称es,es是一个开源高扩展分布式全文检索引擎,它可以近乎实时的存储、检索数据。且本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用java开发并使用Lucene作为核心来实现所用索引和搜索的功能。但是,它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

据国际权威的数据库产品评测机构DB Engines的统计,在2016年1月,ElasticSearch已经超过了Solr等,成为排名第一的搜索引擎类应用。

为什么要选择ElasticSearch

  • SQL:like %% 做模糊查询,如果是大数据,效率慢。 (通过增加索引解决)
  • ElasticSearch/Solr: 全文检索

总而言之:ElasticSearch是作为大数据全文检索的一种优质选型。

Lucene

  • Lucene是一套信息检索工具包!jar包!不包含搜索引擎,包含的:索引结构、读写索引工具、排序、搜索规则…工具类
  • Lucene在java开发环境里是一个成熟的免费开源工具,就其本身而言,Lucene是当前以及最近几年最受欢迎的免费java信息检索程序库。

对比ElasticSearch与Solr

  • ElasticSearch: ElasticSearch是一个基于Apache Lucene™的开源搜索引擎。使用java开发并使用Lucene作为其核心来实现所有索引和搜索的功能。通过使用RESTful API来隐藏Lucene的复杂性。
  • Solr:Solr是Apache下的一个顶级开源项目,采用java开发,基于Lucene的全文搜索服务器。
    • 使用POST方法向Solr服务器发送一个描述Field及其内容的XML文档,Solr根据xml文档添加、删除、更新索引。Solr搜索只需要发送GET请求,然后对Solr返回的xml、json等格式的查询结果进行解析。
    • Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口

ElasticSearch与Solr性能对比


ElasticSearch vs Solr 总结

  • es基本是开箱即用,Solr安装较为复杂
  • Solr利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调治理功能。
  • Solr支持更多格式数据,而ElasticSearch本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑。
  • Solr查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用;
    • ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索。
    • Solr是传统搜索应用的有力解决方案,但ElasticSearch更适用于新兴的实时搜索应用。
  • Solr比较成熟,有一个更大、更成熟的用户、开发和贡献者社区,而ElasticSearch相对开发维护者较少,更新太快,学习使用成本较高。

了解ELK

ELK是ElasticSearch、Logstash、Kibana三大开源框架的缩写。市面上也被称为Elastic Stack。
其中:

  • ElasticSearch是一个基于Lucene、分布式、通过RESTful方式进行交互的近实时搜索平台框架。
  • Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。
  • Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。

市场上很多开发只要提到ELK能够一致说出它是一个日志分析架构技术栈的总称,但实际上ELK不仅仅适用于日志分析,它还可以支持其他任何数据分析和收集的场景,日志分析和收集只是更具有代表性,并非唯一性。

ES核心概念

  • 集群,节点,索引,类型(8.x废弃),文档,分片,映射
  • elasticsearch 是面向文档的,elasticsearch(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档(行),每个文档中有包含多个字段(列),elasticsearch中一切都是JSON
  • 关系型数据库与elasticsearch 对比
  • 物理设计:
    elasticsearch在后台把每个索引划分成多个分片,每片分片可以在集群中的不同服务器间迁移。
  • 逻辑设计:
    一个索引类型中,包含多个文档,当我们索引一片文档时,可以通过这样的一个顺序找到它: 索引 >> 类型 >> 文档ID,通过这个组合我们就能索引到某个具体的文档。 (ID不必是整数,实际上它是个字符串)

文档

elasticsearch是面向文档的,所以索引和搜索数据的最小单位是文档,在elasticsearch中,文档有几个重要属性:

  • 自我包含,一篇文档同时包含字段和对应的值,也就是同时包含key:value
  • 可以是层次型,一个文档中包含子文档,复杂的逻辑实体就是这么来的
  • 灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态添加一个新的字段。

尽管我们可以随意的新增或者忽略某个字段,但是,每个字段的类型非常重要,比如一个年龄字段类型,可以是字符串也可以是整形。因为elasticsearch会保存字段和类型之间的映射及其他的设置。这种映射具体到每个映射的每种类型,这也是为什么在elasticsearch中,类型有时候也称为映射类型。

类型

类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。类型中对于字段的定义称为映射。我们说文档是无模式的,它们不需要拥有映射中所定义的所有字段。

比如新增一个字段,那么elasticsearch是怎么做的呢?

elasticsearch会自动将新字段加入映射,但是这个字段的不确定它是什么类型,elasticsearch就开始推测,如果这个值是18,那么elasticsearch会认为它是整形。但是elasticsearch也可能推测的不对, 所以最安全的方式就是提前定义好所需要的映射,这点和关系型数据库殊途同归了,先定义好字段,然后再使用。

索引

索引就可以理解为关系型数据库的库。索引是映射类型的容器,elasticsearch中的索引是一个非常大的文档集合。索引存储了映射类型的字段和其他设置。然后他们被存储到了各个分片上。

物理设计:节点和分片如何工作

一个集群至少有一个节点,而一个节点就是一个elasticsearch进程,节点可以有多个索引默认的,如果创建索引,那么索引将会有5个分片(primary shard,又称主分片)构成的,每个主分片会有一个副本(replica shard,又称复制分片)

下图是一个有3个节点的集群:

可以看到主分片和对应的复制分片都不会再同一个节点内,这样就有利于某个节点挂掉了,数据也不至于丢失。实际上,一个分片是一个Lucene索引,一个包含 倒排索引 的文件目录,倒排索引的结构使得elasticsearch在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字。

倒排索引

elasticsearch使用的是一种称为倒排索引的结构,采用Lucene倒排索引作为底层。这种结构适用于快速的全文搜索,一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含他的文档列表。

  • 示例一:
    例如,现在有两个文档,每个文档包含如下内容:

    为了创建倒排索引,我们首先要将每个文档拆分成独立的词(或称为词条或者tokens),然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在哪个文档:

    假设现在我们试图搜索 to forever, 只需要查看包含每个词条的文档,forever在doc1和doc2中都存在,to在doc1中存在、doc2中不存在,所以在doc1中匹配度更高,权重(score)也就更高。

  • 示例二:

    下图是4个文档数据。

    elasticsearch会自动为文档创建倒排索引列表,如下图:

    如果要搜索含有linux标签的数据,那么根据倒排索引列表,只需要从文档3和文档4中查询即可,完全过滤掉无关的所有数据,效率会提升很多。

elasticsearch的索引和Lucene的索引对比

在elasticsearch中,索引这个词被频繁使用。在elasticsearch中,索引被分为多个分片,每份分片是一个Lucene索引4。所以一个elasticsearch索引是由多个Lucene索引组成的。

环境准备

  • ElasticSearch
  • ElasticSearch head
  • IK分词器
  • Kibana控制台

Rest风格操作

Rest请求

ES 7.x

method url 描述
PUT localhost:9200/索引/类型/文档id 创建文档(指定文档id)
POST localhost:9200/索引/类型 随机文档(随机文档id)
POST localhost:9200/索引/类型/文档id/_update 修改文档
DELETE localhost:9200/索引/类型/文档id 删除文档
GET localhost:9200/索引/类型/文档id 通过文档id查询文档
POST localhost:9200//索引/类型/_search 查询所有数据

注:

  • 8.x之后由于type被弃用,有许多请求的修改
    8.x URL修改:

    • PUT: localhost:9200/索引/_doc/文档id
    • POST: localhost:9200/索引/_update/文档id

数据类型

  • 字符串类型
    text 、 keyword
  • 数值类型
    long 、integer 、short 、 byte 、 double 、 float 、 half float 、 scaled float
  • 日期类型
    date
  • 布尔类型
    boolean
  • 二进制类型
    binary
  • 等等

关于text与keyword
text类型会被分词器解析,keyword类型不会被分词器解析

指定字段的类型

// 创建索引规则,指定字段类型
PUT /test2
{"mappings": {"properties":{"name": {"type": "text"},"age": {"type": "integer"}}}
}

如果文档没有指定类型,es会给配置默认的字段类型

扩展

  • GET _cat/indices?v (通过_cat命令可以获得很多es当前信息)

复杂查询demo

例子一

GET /test/_search
{"query":{//精确匹配"match": {"name": "人民"}}
}

返回结果解析:
1. hits:{...}     -- 索引和文档的信息
2. hits.total.value   -- 查询出的数量
3. hits.total.relation  -- 查询关系1. eq : 相等
4. hits.max_score  -- 查询结果最大匹配分数
5. hits: [...]   -- 查询结果具体信息1. _index   -- 索引2. _id  -- 文档id3. _score -- 匹配分数4. _source -- 数据

例子二

GET /test2/_search
{"query": {"match": {"name": "人民"}},//只获取指定字段"_source": ["age"],//排序"sort": [{"age": {"order": "desc"}}],//分页"from": 0,"size": 1
}

例子三

布尔值查询

GET /test2/_search
{"query": {//布尔值多条件查询"bool": {// must相当于and ,should相当于or , must_not相当于not"must": [{"match": {"name": "人民"}},{"match": {"age": 18}}],//附加过滤条件"filter": [{"range": {"age": {// gte 大于等于 , gt 大于"gte": 10,// lte 小于等于 , lt 小于"lte": 20}}}]}}
}

高亮查询

GET /test2/_search
{"query": {"bool": {"should": [{"match": {"name": "人民"}}]}},//高亮"highlight": {"fields": {// 高亮字段"name": {}}}
}

GET /test2/_search
{"query": {"bool": {"should": [{"match": {"name": "人民"}}]}},"highlight": {// 自定义标签前缀"pre_tags": "<span class='key' style='color:red'>",// 自定义标签后缀"post_tags": "</span>", "fields": {"name": {}}}
}

其他

  • 精确查找: term查询是直接通过倒排索引指定的词条进行精确查询的。
  • 关于分词:
    • term:直接精确查询
    • match:会使用分词器解析 (先分析文档,然后再通过分析的文档进行查询)

ElasticSearch7.6.x 学习笔记相关推荐

  1. 【ElasticSearch7.X】学习笔记(一)

    [ElasticSearch7.X]学习笔记 一.介绍 1.1.ElasticSearch 1.2.RESTful 1.3.数据格式 二.下载安装(单机部署) 2.1.解压文件 2.2.修改配置配置 ...

  2. 【ElasticSearch7.X】学习笔记(三)

    [ElasticSearch7.X]学习笔记 五.集群部署 5.1.相关概念 5.1.1.集群 Cluster 3.1.2.节点 Node 5.2.下载安装 5.3. 启动 5.4. 测试 六.进阶 ...

  3. centos elasticsearch7 安装_SkyWalking学习笔记(CentOS环境)

    基于 CentOS 环境使用 SkyAPM-dotnet 来介绍一下 SkyWalking, SkyAPM-dotnet 是 SkyWalking 的 .NET Agent 环境要求 JDK8+ El ...

  4. Elasticsearch7.6.x学习笔记(超详细)

    Elasticsearch和solr比较 当单纯的对已有的数据进行搜索时,solr更快 当实时建立索引时,Solr会产生io阻塞,查询性能交叉,ElasticSearch具有明显优势 随着数量的增加, ...

  5. Elasticsearch-7.x学习笔记

    本文转载自:阅读原文 文章目录 1. 单节点安装 2. ES安装head插件 3. Elasticsearch Rest基本操作 REST介绍 CURL创建索引库 查询索引-GET DSL查询 MGE ...

  6. Elasticsearch7学习笔记(中)

    Elasticsearch是实时全文搜索和分析引擎,提供搜集.分析.存储数据三大功能:是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统.它构建于Apache Lucene ...

  7. Elasticsearch7.17学习笔记

    前言 本学习笔记主要基于 阅读Elasticsearch7.17版本官方文档和实操总结而来,官方文档地址https://www.elastic.co/guide/en/elasticsearch/re ...

  8. mysql学习笔记(13)之mycat切分规则与es基础

    mycat切分规则与es基础 mycat基础配置 mycat切分规则 es,es-head,kibana简介与安装 Windows下安装 es分布式搜索引擎安装 elasticsearch-head安 ...

  9. ElasticSearch基础学习笔记

    在学习ElasticSearch之前,先简单了解一下Lucene: Doug Cutting开发 是apache软件基金会4 jakarta项目组的一个子项目 是一个开放源代码的全文检索引擎工具包 不 ...

最新文章

  1. LOJ 2537 「PKUWC2018」Minimax
  2. Linux下Java开发环境的搭建Tomcat6+jdk6+eclipse3.5.2+Myeclipse9.0+mysql5.1.47
  3. 深度学习 | 反卷积/转置卷积 的理解 transposed conv/deconv
  4. 黑马程序员_网络编程总结
  5. $.each()、$.map()区别浅谈
  6. python编程从入门到实践pdf_Python编程入门研读笔记(二)
  7. Spring源码分析之ProxyFactoryBean方式实现Aop功能的分析
  8. python socketserver模块详解_Python: SocketServer模块
  9. 计算机网络知识梳理(1)——网络层次
  10. LeetCode刷题——91. 解码方法
  11. java exe指的是什么_Java程序的执行过程中用到一套JDK工具,其中java.exe是指( )。
  12. ActiveMQ 简介、安装、与 Maven 项目基本使用
  13. 接口与抽象类的相同点和不同点
  14. 增强旋转不变LBP算法及其在图像检索中的应用
  15. 魔改Dual Thrust示例策略
  16. 计算机在运行表格的时候很慢,win7系统打开excel2007表格很慢的解决方法
  17. 银河麒麟高级服务器操作系统 V10 版本安装教程
  18. idea 项目添加图片或更换图片 引用后没反应(清缓存)
  19. Verilog编程规范——reset
  20. <_main__.类名 object at 0x0000000002A7CEB8>

热门文章

  1. 两个人约定7:00-8:00见面,如果某个人先到了,只等待15min,问两人见面的概率多少?
  2. 微擎公众号如何配置微信支付?
  3. 【更新了资源链接】几行小代码保持浏览器活跃 辅助挖共生币
  4. 防船舶碰撞桥梁预警系统
  5. 可调增益运放AD603
  6. SAP事务码开关控制,TCODE
  7. 计算机教学设计与反思,信息技术应用 用计算机画函数图象教学设计与反思
  8. 网络协议 P2p 学习 - Shareaza - 编译
  9. Reflector、ReflectorFactory的今生
  10. 2020CCPC长春 部分题解