首页 > 其他分享 >【Elasticsearch】分布式搜索引擎技术学习[上]

【Elasticsearch】分布式搜索引擎技术学习[上]

时间:2024-10-22 19:21:06浏览次数:3  
标签:搜索引擎 索引 文档 库名 操作 Elasticsearch id 分布式

目录

一.认识与了解搜索引擎

1.介绍

2.安装

二.初步了解 Elasticsearch

1.倒排索引

2.IK分词器

3.基础概念

三.Elasticsearch基础操作

1.索引库操作

1.1.常见映射属性

1.2.索引库的·CRUD 操作

2.文档操作

1.1.文档的 CRUD 操作

1.2.批量处理

四.ES 的 Java 客户端

1.客户端的初始化

2.客户端操作

2.1.索引库操作

2.2.文档操作

2.3.批处理        


一.认识与了解搜索引擎

1.介绍

        Elasticsearch 是一项功能强大且广受欢迎的开源搜索引擎,它不仅显著提升了搜索速度,还广泛应用于各种搜索场景中。事实上,我们所熟悉的百度、360、谷歌等主流浏览器在提供搜索服务时,都借鉴或采用了类似的搜索引擎技术。Elasticsearch 开源和免费特性,使其成为了开发者们构建高效搜索功能的首选工具。

Elasticsearch 具有下列优势:

        1.支持分布式,可水平扩展。

        2.提供 Restful 接口,可以被任何语言调用。

        而这些特性也使得它成为了一项热门的技术。

        随着发展也产生了可以与之相结合的一些技术,分别是 kibana、Logstash、Beats,共同组成一套技术栈,统称为 ELK,被广泛的应用在日志数据分析、实时监控等领域。

2.安装

        我们使用 docker 进行 Elasticsearch 以及 Kibana 的安装部署。

2.1.安装 Elasticsearch

        将下载好的 tar 包移动到虚拟机中,使用 docker load -i xxx.tar,加载完毕后通过下面的 docker 命令进行安装:

docker run -d \
  --name es \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  -e "discovery.type=single-node" \
  -v es-data:/usr/share/elasticsearch/data \
  -v es-plugins:/usr/share/elasticsearch/plugins \
  --privileged \
  --network hm-net \
  -p 9200:9200 \
  -p 9300:9300 \
  elasticsearch:7.12.1

-d:后台运行        --name:起名       

-e:配置环境变量:

        ①:内存配置,默认 1G        ②:运行模式(集群/单点) 
-v:数据卷挂载:

        ①:数据存储目录        ②:插件目录

--network:网络

-p:端口:       

        ①:Http 访问端口        ②:用于集群间通信      

  elasticsearch:7.12.1

              镜像名:版本

       之后就可以在浏览器中通过访问虚拟机的 ip + 端口号 来访问得到响应(Restful 风格

2.2.安装 Kibana

        将下载好的 tar 包移动到虚拟机中,使用 docker load -i xxx.tar,加载完毕后通过下面的 docker 命令进行安装:

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601  \
kibana:7.12.1

-e:配置 elasticsearch 的服务器地址 es 是安装 elasticsearch 时的容器名

        之后就可以在浏览器中通过访问虚拟机的 ip + 端口号 来访问 Kibana 的平台界面

        我们安装 Kibana 主要会使用它其中的开发控制台,便于我们熟悉其语法规则,其他的功能并不会进行学习。


二.初步了解 Elasticsearch

1.倒排索引

        ES 在处理大量数据搜索时,速度远远高于传统的关系型数据库,原因就是它的底层使用的是一种倒排索引

        传统数据库(如 Mysql)采用正向索引,因其默认引擎为 InnerDB,底层基于 B+ 树将数据挂载到 Id 对应的节点上根据 Id 快速查询,但如果不通过 Id,而是其他例如名称等模糊匹配,则效率会因逐行匹配大大降低

        1.文档(document):每一条数据就是一个文档,文档是Elasticsearch进行数据索引和搜索的基本单位。

        2.词条(term):文档按照语义分成的词语,在 Elasticsearch 中,文档的内容会被分词器Analyzer)分割成一系列的词条,然后这些词条会被索引到 Elasticsearch 的底层数据结构(如倒排索引)中。

        不仅给文档建立索引,还会给文档被分成的词语建立索引。在进行搜索时,会执行两次搜索,第一次搜索文档得到词条第二次根据得到的词条中的文档 Id 来搜索文档,优势是两次搜索都使用了索引来进行匹配,大大提高了搜索效率。

2.IK分词器

        分词器的作用是创建倒排索引,对文档分词,以及对文档进行语义分析来分词,像英文单词这种则十分容易分析,而像中文这样博大精深的语言因其一句话通过不同的断句会产生不同的含义(你想吃什么,想吃你下面)。而这就需要一款开源的中文分词器,于是 IKIKUN 分词器就产生了。其采用的正向迭代最细粒度切分算法一直沿用至今。

        可以在 github 上获取到该插件,获取后移动至虚拟机中的 ES 插件对应的数据卷中即可。挂载完毕后 docker restart es 重启 ES 即可加载该插件。

        安装后可以在 Kibana DevTools 中来测试 IK 分词器。

        这是普通分词器的分词效果

        这是 IK 分词器的分词效果,它具有种模式,一种为 ik_smart 智能切分,粗粒度;一种是 ik_max_word 最细切分,细粒度。

        可以看到它成功的将中文分成了不同词条,它通过内部的词典来进行遍历分析匹配词条。而随着网络的发展,会出现许多新颖的词汇,而词典的内容是固定的,所以 IK 分词器允许我们配置扩展词典来定义自定义的词库。

        配置好本地的词典后,会在当前目录查找扩展词典。 

3.基础概念

        1.索引(Index):文档数据在 ES 中存储时会被序列化为 json 格式后存储在 ES 中,其中类型相似的归为一类索引,是文档的集合,类似于数据库的表(Table)。

        2.文档(Document):就是一条条的数据,类似于数据库中的行(Row),都是 json 的格式。 

        3.字段(Field):就是 json 文档中的字段,类似于数据库中的列(Column)。

        4.映射(Mapping):是索引中文档的约束,例如字段类型约束,类似于数据库中的表结构(Schema)。

        5.DSL:ES 中提供 json 风格的请求语句,用来定义搜索条件,类似于数据库中的 SQL


三.Elasticsearch基础操作

1.索引库操作

1.1.常见映射属性

        首先,想要创建一个索引库,需要先使用 Mapping 去约束索引中的文档,所有需要先了解常见Mapping 映射属性。

1.type:字段数据类型常见的有:

        1.1.字符串:text可分词的文本)、keyword精确值,如国家、ip 地址,不需要分词

        1.2.数值:long、integer、short、byte、double、float 等

        1.3.布尔:boolean 

        1.4.日期:date

        1.5.对象:object

2.index:是否创建索引,默认为 true。

3.analyzer:使用哪种分词器,只有 text 类型的数据可能需要,而其它字段大多不需要。

4.properties:该字段的子字段。

1.2.索引库的·CRUD 操作

        ES 提供的所有 API 都是 Restful 的接口(GET、PUT、POST、DELETE),遵循 Restful 的基本规范,如 GET、POST、PUT、DELETE 的请求方式。

创建:

PUT /es
{
  "mappings": {
    "properties": {
      "info":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "age":{
        "type": "byte"
      },
      "eamil":{
        "type": "keyword",
        "index": false
      },
      "name":{
        "type": "object", 
        "properties": {
          "firstName": {
            "type": "keyword"
          },
          "lastName": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

       es:索引库名称                properties:属性        info、age、email...:都是字段名

        firstName:子字段名

        运行后显示运行完成,创建索引库成功。

        而类似的查询、删除操作,也可以如上述操作实现。(如 GET /索引库名称

        但修改操作中存在不同,索引库和 mapping 一旦创建无法修改,因其会对数据库中的数据造成很大的影响。但可以添加新的字段,如下图所示,创建一个没有 age 字段的索引库,只能新增 age 字段,而无法修改其他字段,例如该字段的类型。(PUT / 索引库名 / _mapping)

总结

创建索引库:PUT / 索引库名                                     删除索引库:DELETE / 索引库名

查询索引库:GET / 索引库名                                     添加字段:PUT / 索引库名 / _mapping

2.文档操作

1.1.文档的 CRUD 操作

        与之前的索引库CRUD 操作类似,文档CRUD 操作也是 Restful 风格

创建:

        在新增文档时要在索引库名后跟 /_doc 表示对文档的操作,后面的 1 代表文档的 id,如果不指定 id 则会随机生成不便于我们之后的操作。

        与之类似的查询、删除操作也是同样的格式:

        而在修改操作时,可以使用两种方式:

方式一:全量修改

        这种方式会删除旧的文档,添加新文档。但注意如果文档的 id 不正确,会将本不应修改的文档删除,并新增文档。

方式二:增量修改

        这种方式可以修改指定字段值,注意 /_doc 更改为 /_update,并在 “doc":{ } 中添加要修改的字段值

总结

创建文档:POST/索引库名/_doc/文档id        删除文档:DELETE/索引库名/_doc/文档id

查询文档:GET/ 索引库名/_doc/文档id         

修改文档:1.全量修改:PUT/索引库名/_doc/文档id

                  2.增量修改:POST/索引库名/_update/文档id { “doc”:{ 字段 } }

1.2.批量处理

        Elasticsearch 中允许通过一次请求中携带多次文档操作,也就是批量处理,这可以帮助我们快速地进行对文档的各种操作。

        语法格式要求一行一行的输入,第一行 "index" 为操作的类型是新增,_index 表示要操作的索引库_id 表示索引库的文档 id;第二行【 “字段名”:“值”】依次写使用 分隔,可以看到成功新增了两个字段,id 分别为 23。


四.ES 的 Java 客户端

1.客户端的初始化

        ①.引入 es 的 RestHighLevelClient 依赖

    <!--Elasticsearch-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </dependency>

        ②.覆盖 SpringBoot 中管理的版本。

在父工程中的版本管理中添加要使用的对应版本覆盖掉 SpringBoot 中管理好的版本。

<elasticsearch.version>7.12.1</elasticsearch.version>

        ③.初始化

        在测试中初始化客户端,使用 setUp 方法在其中进行初始化,其中构建时传入Elasticsearch的地址,这里为虚拟机中部署的地址。而 tearDown 方法用于在测试结束后关闭 client。测试后连接正常,完成初始化

2.客户端操作

2.1.索引库操作

        在设置对应字段的 Mapping 映射时,可以根据库表结构业务需求来设计映射。而在 Java 中创建索引库的 javaAPI 具体操作与 Restful 接口 API 之间对应。

①.创建 ( Create/Get/Delete ) IndexRequest 对象,指定索引库名

②.准备请求参数(Create时需要)。

③. 发送请求,调用不同的方法(create、get (exists)、delete)。

 ●其中 MAPPING_TEMPLATE Json 格式的字符串对应控制台中的数据。

 ●XContentType.JSON 该枚举表示为 JSON 格式

 ●indices 方法获取索引库操作的所有法

 ●RequestOptions.DEFAULT 用作请求选项的默认值。这个对象封装了执行请求时可能需要的配置参数

Get 和 Delete

2.2.文档操作

①.创建 IndexRequest 对象,指定索引库名以及 id

②.准备要创建的文档的 JSON 格式数据

③. 发送请求,调用不同的方法(create、get (exists)、delete)。

Get和Delete

        注意,Get 成功后获取到的数据由右边→_→大红框中的数据,需要进行解析获取对应 Json 信息,输出如下方控制台内容所示。(注意可以直接在 GetRequest 方法中 添加 id

        想要修改文档时也可分为两种操作:

①全量更新:再次写入相同的 id 覆盖掉之前的旧文档。

        与新增文档操作一致,只需修改传入 JSON 的内容或传入对象的 JSON 格式字符串前修改对象的属性信息即可。

②局部更新:局部更新,只更新指定的部分字段。

         通过 doc 方法传入想要更新的字段名信息

2.3.批处理        

        想要进行批处理,流程与控制台操作类似,但会用到 BulkRequest 封装普通的 CRUD 请求

        通过在 BulkRequest 对象中添加多次操作,最后使用 bulk 方法发送请求,进行批处理。


标签:搜索引擎,索引,文档,库名,操作,Elasticsearch,id,分布式
From: https://blog.csdn.net/t46464949/article/details/142796620

相关文章

  • 在分布式数据库中,如何选择合适的数据分片策略?
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • MySQL和Elasticsearch使用场景
    来源:https://www.zhihu.com/question/637732937ES的底层实现:倒排索引正排索引(ForwardIndex)的实现方式为,通过文档ID去查找整个文档内容,适用于全部文档遍历或根据某个文档ID查找内容的场景。而倒排索引(InvertedIndex)的实现方式,则是通过文档中的关键词去查找文档ID列表,这也就是其非......
  • 鸿蒙分布式商城应用开发探究
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、项目概述1.项目背景随着智能设备......
  • 鸿蒙分布式商城应用开发探究
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、项目概述1.项目背景随着智......
  • Elasticsearch应用与源码的学习方法是什么?
    学习Elasticsearch的应用与源码,可以按照以下步骤进行:入门基础:首先,可以通过官方文档或一些入门教程来了解Elasticsearch的基本概念和功能。例如,可以参考《Elasticsearch入门教程》 和《ElasticSearch入门篇(保姆级教程)-coderxz-博客园》。这些资源会介绍Elasticsearch的......
  • ELK01 Elasticsearch部署和管理,集群工作机制 ubuntu使用
    企业级日志分析系统ELK1.1.1什么是ELK1.Elasticsearch是一个实时的全文搜索,存储库和分析引擎。2.Logstash是数据处理的管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如Elasticsearch等存储库中。(java开发,有数据处理能力,比较重)3.Kibana则可以让用户......
  • 【顶级EI复现】分布式电源选址定容的多目标优化算法(Matlab代码实现)
     ......
  • 在K8S中,有家拥有分布式系统的跨国公司,拥有大量数据中心,虚拟机和许多从事各种任务的员
    对于拥有分布式系统的跨国公司,且该公司拥有大量数据中心、虚拟机以及众多从事各种任务的员工,采用Kubernetes(K8s)来管理所有任务是一种高效且灵活的方式。以下是一些建议,说明该公司如何以与Kubernetes一致的方式管理所有任务:1.利用Kubernetes的容器化特性容器化应用程序:将公司......
  • c# Elasticsearch统计Nested的数据
    我是直接问百度ai   es统计是nested结构的数据,数据有年份:reportyear,名称:accountnamezh,类型:reportperiodtype,利润:originalvalue,,需要统计:2024年,名称:营业收入,类型:2,的利润合计是多少,利润金额比较大,需要除以100000000然后生成的es是POST/your_index/_search{"query":{......
  • 分布式追踪系统Jaeger
    什么是Jaeger?Jaeger是一个分布式追踪系统,主要用于监控和故障排查分布式系统中的微服务架构。它帮助开发者跟踪请求在多个微服务中的路径,发现系统瓶颈,并分析各个服务之间的延迟和依赖关系。Jaeger最早由Uber开发,现在已经成为CNCF(CloudNativeComputingFoundation......