Elasticsearch 8.5.1

Lucene

  • 由 Doug Cutting 开发,2000年3月 第一个开源版本
  • apache软件基金会 jakarta项目组的一个子项目
  • 是一个开放源代码的全文检索引擎工具包
  • 不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)
  • 当前以及最近几年最受欢迎的免费Java信息检索程序库

Lucene是一套信息检索工具包!是jar包!不包含搜索引擎系统!包含:索引结构!读写索引、排序、搜索规则等功能(工具类!)

Lucene和ElasticSearch的关系:ElasticSearch是基于Lucene 做了一下封装和增强


ElasticSearch

官网:Download Elasticsearch | Elastic

ElasticSearch(简称为es)是一个开源的高扩展分布式全文检索引擎,它可以近乎 实时存储、检索数据

本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。

es是使用java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的REST-ful的API来隐藏Lucene的复杂性,从而让全文搜索变得简单


1. ElasticSearch和Solr区别

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

性能比较

  • 当单纯的对已有数据进行搜索时,Solr更快
  • 当实时建立索引时,Solr会产生io阻塞,查询性能较差,ElasticSearch具有明显的优势
  • 随着数据量的增加,Solr的搜索效率会变得更低,而ElasticSearch却没有明显的变化

主要记住:Solr 的架构不适合实时搜索的应用


2. 安装与启动

2.1 安装

下载地址:Download Elasticsearch | Elastic

2.2 目录介绍

/bin:启动文件
/config:配置文件
  -  /log4j2:日志配置文件
  -  /jvm.options:java虚拟机相关的配置
  -  /elasticsearch.yml:elasticsearch的配置文件!默认9200端口!跨域!
/lib:相关jar包
/logs:日志
/modules:功能模块
/plugins:插件!

2.3 启动

1)点击bin文件夹下的elasticsearch.bat,自动初始化elasticsearch.yml后对其进行配置,这里暂时只是为了方便学习禁用了一些设置

2)点击bin文件夹下的elasticsearch.bat,然后访问9200端口

如果报NoSuchFileException相关错误,是因为在环境变量中配置了classpath,将其删除即可!

启动后访问localhost:9200,成功响应


2.4 安装es可视化界面

  1. 安装node,如果报权限错误则使用管理员执行

  2. 安装head插件

    • 安装cnpm

      # 安装cnpm的命令
      npm install -g cnpm -registry=https://registry.npm.taobao.org
      
    • 安装head插件:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster

      git clone git://github.com/mobz/elasticsearch-head.git
      cd elasticsearch-head
      
      # cnpm下载资源更快
      cnpm install
      npm run start
      

      如果cnpm不能使用,需要设置:

      1. windows系统搜索Windows PowerShell,以管理员的权限打开
      2. 输入set-ExecutionPolicy RemoteSigned,点击回车
      3. 输入A(选择A),回车
      4. 重新回到项目就可以使用cnpm密令
    • 访问9100端口,连接测试发现跨域问题,配置es的elasticsearch.yml文件解决跨域问题

    # 开启跨域支持
    http.cors.enabled: true
    # 允许所有人可以访问
    http.cors.allow-origin: "*"
    
    • 重启es服务,访问9100端口后再次连接,成功响应

  3. 安装Kibana

    官网下载:https://www.elastic.co/cn/kibana/

    注意:Kibana 要和 ES 版本一致!!!

    解压后点击bin/Kibana.bat启动,访问5601端口,成功响应

    汉化:修改config/Kibana.yml文件,添加i18n.locale: "zh-CN",重启即可


2.5 安装IK分词器插件

分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,比如“我爱大数据”会被分为“我”,”爱”,“大”,”数”,“据”,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题;如果要使用中文,建议使用IK分词器

下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases

下载后解压到 plugins 目录下

bin目录下通过elasticsearch-plugin list命令查看当前插件列表

重启es,如果报版本错误,修改ik目录下的plugin-descriptor.properties文件:elasticsearch.version=当前使用es版本

修改config/IKAnalyzer.cfg.xml文件可增加自己的配置

ik提供了两个分词算法:ik_smartik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分!


3. 了解ELK

ELKElasticsearch、Logstash、Kibana三大开源框架首字母大写简称,市面上也被成为Elastic Stack

  • Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es

  • Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)

  • Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能

    Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据

    使用Kibana,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态。设置Kibana非常简单。无需编码或者额外的基础架构,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测

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


4. 版本重要特性

Elasticsearch 5.0

  1. 首先说明下,ES是从版本2直接跳到5的,主要是为了和Elastic Stack其他组件保持版本一致
  2. ES5,在现在来说是比较老的版本了,就不多介绍了
  3. 建议大家使用ES7,或者直接使用ES8

Elasticsearch 6.0

  1. 移除type,在 6.0 里面,开始不支持一个 index 里面存在多个 type 了,所有的新的 index 都将只有一个虚拟的固定的 type: doc 来代替
  2. 稀疏性 Doc Values 的支持, es 的 doc values 是列式存储,文档的原始值都是存放在 doc values 里面的,优化了一个文档有的字段其他文档的持有开销
  3. Index sorting,即在索引阶段的排序支持,索引的时候会要增加额外开销,适合不怎么变化的索引的场景。
  4. 已经关闭的索引将也支持 replica 的自动处理,确保数据可靠
  5. Load aware shard routing, 基于负载的请求路由,目前的搜索请求是全节点轮询,那么性能最慢的节点往往会造成整体的延迟增加,新的实现方式将基于队列的耗费时间自动调节队列长度,负载高的节点的队列长度将减少,让其他节点分摊更多的压力,搜索和索引都将基于这种机制。
  6. 顺序号的支持,每个 es 的操作都有一个顺序编号(类似增量设计)无缝滚动升级

Elasticsearch 7.0

  1. ES 数据库的存储结构变化:去除了Type,包括API层面
  2. 默认配置变化:默认节点名称为主机名,默认分片数为1,不再是5
  3. 查询相关速度优化:Weak-AND算法。又称为Wand算法, 输入是n个倒排队列,输出top K个得分最高的文档doc,weak-and算法通过计算每个词的贡献上限来估计文档的相关性上限,从而建立一个阈值对倒排中的结果进行减枝,从而得到提速的效果。
  4. 彻底废除 _all 字段的支持,为提升性能默认不在支持全文检索
  5. 集群连接变化:TransportClient被废弃,对于java编程,建议采用 High-level-rest-client 的方式
  6. ES程序包默认打包jdk:以至于7.x版本的程序包大小突然边300MB+
  7. 间隔查询(Intervals queries),Elasticsearch 7.0中的间隔查询引入了一种构建“单词或短语彼此相距一定距离的记录查询”的需要的全新方式,与之前的方法(跨度查询span queries)相比,使用和定义更加简单。
  8. 函数分数 2.0,通过新的模块化结构,用户能够混合和匹配一组算术和距离函数,从而构建任意的函数分数计算方式,进而在更大程度上控制结果的评分和排名方式。
  9. 引入新的集群协调子系统,移除 minimum_master_nodes 参数,让 Elasticsearch 自己选择可以形成仲裁的节点。
    典型的主节点选举现在只需要很短的时间就可以完成。集群的伸缩变得更安全、更容易,并且可能造成丢失数据的系统配置选项更少了。 节点更清楚地记录它们的状态,有助于诊断为什么它们不能加入集群或为什么无法选举出主节点。
  10. 不再内存溢出,新的 Circuit Breaker 在JVM 堆栈层面监测内存使用,Elasticsearch 比之前更加健壮。设置indices.breaker.fielddata.limit的默认值已从JVM堆大小的60%降低到40%。
  11. 支持达到纳秒级精度,强化时序型用例
  12. Lucene9.0的支持
  13. 7.1开始,Security功能免费使用

Elasticsearch 8.0

elastic 8.0 版通过改进 Elasticsearch 的矢量搜索功能、对现代自然语言处理模型的原生支持、不断简化的数据上线过程,以及精简的安全防护体验,在速度、扩展幅度、相关性和简便性方面,迎来了一个全新的时代。需要 Java 17 才能运行 Elasticsearch

Elastic 8.0 版是基于 Lucene 9.0 开发的,那些利用现代 NLP 的搜索体验,都可以借助(新增的)对近似最近邻搜索的原生支持,快速且大规模地实现。通过 ANN,可以快速并高效地将基于矢量的查询与基于矢量的文档语料库(无论是小语料库、大语料库还是巨型语料库)进行比较

重要更新

  1. Rest API相比较7.x而言做了比较大的改动(比如彻底删除_type),为了降低用户的升级成本,8.x会暂时的兼容7.x的请求
  2. 默认开启安全配置(三层安全),并极大简化了开启安全需要的工作量,可以这么说:7.x开启安全需要10步复杂的步骤比如CA、证书签发、yml添加多个配置等等,8.x只需要一步即可)
  3. 存储空间优化:更新了倒排索引,对倒排文件使用新的编码集,对于keyword、match_only_text、text类型字段有效,有3.5%的空间优化提升,对于新建索引和segment自动生效
  4. 优化geo_point,geo_shape类型的索引(写入)效率:15%的提升
  5. 新特性:支持上传pyTorch模型,在ingest的时候使用。比如在写入电影评论的时候,如果我们想要知道这个评论的感情正负得分,可以使用对应的AI感情模型对评论进行运算,将结果一并保存在ES中
  6. 技术预览版KNN API发布,(K邻近算法),跟推荐系统、自然语言排名相关。之前的KNN是精确搜索,在大数据集合的情况会比较慢,新的KNN提供近似KNN搜索,以提高速度
  7. 对ES内置索引的保护加强了:elastic用户默认只能读,如果需要写权限的时候,需有allow_restrict_access权限

5. ES的核心概念

集群,节点,索引,类型,文档,分片,映射是什么?

关系型数据库 和 ElasticSearch客观对比

Relational DB ElasticSearch
数据库(database) 索引(indices)
表(tables) types
行(rows) documents
字段(columns) fields

elasticsearch(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档(行),每个文档中又包含多个字段(列)


5.1 逻辑设计

文档

elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档

elasticsearch中,文档有几个重要属性

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

类型

类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器

类型中对于字段的定义称为映射,比如name映射为字符串类型

我们说文档是无模式的,它们不需要拥有映射中所定义的所有字段,比如新增一个字段,那么elasticsearch是怎么做的呢?

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

索引

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


5.2 物理设计

节点和分片

elasticsearch在后台把每个索引划分成多个分片,每个分片可以在集群中的不同服务器间迁移!

那么节点和分片又是如何工作?

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

主分片和对应的复制分片都不会在同一个节点内,这样有利于某个节点挂掉了,数据也不至于丢失

实际上,一个分片是一个Lucene索引,一个包含倒排索引的文件目录,倒排索引的结构使得elasticsearch在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字

那么什么是倒排索引?


倒排索引(面试题)

个人理解:按文档中出现关键词的次数进行倒排,形成关键词到文档的一个对应关系(倒排索引)

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

study every day,good good up to forever #文档1包含的内容
To forever,study every day,good good up #文档2包含的内容

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

term doc_1 doc_2
Study
To
every
forever
day
study
good
every
to
up

现在,我们试图搜索to forever,只需要查看包含每个词条的文档。权重score

term doc_1 doc_2
to
forever
total 2 1

两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键字的文档都将返回

elasticsearch索引和Lucene索引对比:

在elasticsearch中,索引这个词被频繁使用,这就是术语的使用。在elasticsearch中,索引被分为多个分片,每份分片是一个Lucene的索引。所以一个elasticsearch索引是由多个Lucene索引组成的。别问为什么,谁让elasticsearch使用Lucene作为底层呢!

如无特指,说起索引都是指elasticsearch的索引


6. restful风格说明

一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制

基本rest说明:

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 查询所有数据

官方API文档:REST APIs


6.1 创建

6.1.1 不指定字段类型

PUT /test1/_doc/1
{
  "name": "一洋",
  "age": "23"
}

6.1.2 指定字段类型

字段数据类型

  • 字符串类型:text、keyword
    • text:支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储
    • keyword:不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为:32766个UTF-8类型的字符,可以通过设置ignore_above指定支持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果
  • 数值型:long、Integer、short、byte、double、float、half floatscaled float
  • 日期类型:date
  • 布尔类型:boolean
  • ... ...

类似于建库(建立索引和字段对应类型),也可看做规则的建立

PUT /test2
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "long"
      },
      "birthday": {
        "type": "date"
      }
    }
  }
}


6.2 查询

PUT /test3/_doc/1
{
  "name": "一洋",
  "age": 23,
  "birth": "2000-7-7"
}
# 查询索引
GET test3
# 查询指定字段,可以配置更多的参数
GET /test3/_search
{
  "query": {
    "match": {
      "name": "一洋"
    }
  }
}

如果自己的文档字段没有被指定,那么ElasticSearch就会给我们默认配置字段类型

扩展:通过get _cat/ 可以获取ElasticSearch当前很多信息!

GET _cat/indices
GET _cat/aliases
GET _cat/allocation
GET _cat/count
GET _cat/fielddata
GET _cat/health
GET _cat/indices
GET _cat/master
GET _cat/nodeattrs
GET _cat/nodes
GET _cat/pending_tasks
GET _cat/plugins
GET _cat/recovery
GET _cat/repositories
GET _cat/segments
GET _cat/shards
GET _cat/snapshots
GET _cat/tasks
GET _cat/templates
GET _cat/thread_pool

6.3 修改

_version都会自增,主要区别在于字段会不会丢失

6.3.1 PUT方式

  • 但是如果漏掉某个字段没有写,那么将更新没有写的字段 ,即字段会丢失
PUT /test3/_doc/1
{
  "name" : "一洋洋",
  "age" : 18
}
GET /test3/_doc/1

6.3.2 POST方式

  • 不会丢失字段
POST /test3/_update/1
{
  "doc":{
    "name" : "一洋"
  }
}
GET /test3/_doc/1

6.4 删除

DELETE /test3

参考

【狂神说Java】ElasticSearch7.6.x最新完整教程通俗易懂_哔哩哔哩_bilibili

《狂神说Java》(1)ElasticSearch7.6.x(了解es,学习语法)-KuangStudy-文章

【狂神说Java】ElasticSearch7.6.x_隔壁郑同学的博客-CSDN博客

Elasticsearch各个版本重要特性_坚持是一种态度的博客-CSDN博客

ElasticSearch8-使用教程_胡安民的博客-CSDN博客

posted @ 2022-11-20 15:29  黄一洋  阅读(331)  评论(0)    收藏  举报