【es】基本概念理解

2023-05-16

一,初识es

1.是什么?

ElasticSearch 简称es,开源的分布式的全文搜索引擎,可以近乎实时的存储检索数据,es使用java开发,并且使用Lucene作为核心实现搜索功能。

2.能干什么?

分布式的搜索引擎,全文检索,数据分析引擎(分组聚合),对海量数据实时处理

3.有什么特点?

      快速搜索,分布式部署,可按照分数排序,resultful所有操作可以通过http接口进行

(1)分布式的实时文档存储,每个字段都可以被搜索和索引

(2)分布式的实时文档搜索引擎

(3)胜任上百个服务节点的拓展,支持PB以上的结构化和非结构化数据

4.使用场景?

       搜索类场景,日志分析类场景(经典的ELK组合,可完成日志收集分析存储)5

5.同类搜索对比?

      同类的有Lucene,solr,ElasticSearch是目前主流的全文搜索方案,但是 Lucene 只是一个工具包,它不是一个完整的全文检索引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

目前以 Lucene 为基础建立的开源可用全文搜索引擎主要是 Solr 和 Elasticsearch。

Solr 和ElasticSearch都是基于Lucene实现的,不同点如下:

1.solr利用zookpper进行分布式管理,而ElasticSearch自身携带分布式协调管理功能

2.elasticSearch实时性更好

相同点:

底层都依赖Lucene,lucene能实现全文搜索因为实现了倒排索引的查询结构

6.版本迭代?

6.1 集群连接变化

 transportClient被抛弃,es7的java代码,只能使用restClient,建议使用

High-level-rest-client的方法操作es集群

6.2 存储结构变化

  es7中使用默认的_doc作为type

6.3 默认配置变化

  默认节点为主机名,默认分片数改为1,不再是5

6.4 Lucene升级为lucene 8 查询相关性速度优化

二,入门概念

 1.索引 index

      理解为关系型数据库

 2.type

     理解为数据库中的一张表,注意ES各个版本之前区别很大

     es5中一个index可以有多个type; es6中一个index 只能有一个type;es7中逐步移除

type这个概念

3.映射 mapping

    定义了每个字段的类型等信息,相当于关系型数据库的表结构

4.常用数据类型

  String类型,分为两种。 text:可分词,不可参与聚合;keyWord:不可分词,数据作为完整字段匹配,可以参与聚合

     数字:number,可以分为Long,integer,short,byte,double,float

     数组:array

     布尔:boolean

     日期:可以对日期格式格式化日期存储,但是建议存储为毫秒值,存储为long,节省空间。

     经纬度:geo_point,ip

     对象:object,例如

{
    "name":"Jack",
    "age":21,
    "girl":{
        "name":"Rose",
        "age":21
    }
}

  4.通过和关系型数据库的对比,能更加容易理解

5.ik分词器

有两种分词模式:ik_matx_word 和ik_smart模式

1.ik_max_word(常用)

 将文本做最细粒度拆

如果对“南京市长江大桥”采用ik_max_word分词

POST _analyze
{
   "analyzer": "ik_max_word",
   "text": "南京市长江大桥"
}

分词结果如下:

{
   "tokens": [
      {
         "token": "南京市",
         "start_offset": 0,
         "end_offset": 3,
         "type": "CN_WORD",
         "position": 0
      },
      {
         "token": "南京",
         "start_offset": 0,
         "end_offset": 2,
         "type": "CN_WORD",
         "position": 1
      },
      {
         "token": "市长",
         "start_offset": 2,
         "end_offset": 4,
         "type": "CN_WORD",
         "position": 2
      },
      {
         "token": "长江大桥",
         "start_offset": 3,
         "end_offset": 7,
         "type": "CN_WORD",
         "position": 3
      },
      {
         "token": "长江",
         "start_offset": 3,
         "end_offset": 5,
         "type": "CN_WORD",
         "position": 4
      },
      {
         "token": "大桥",
         "start_offset": 5,
         "end_offset": 7,
         "type": "CN_WORD",
         "position": 5
      }
   ]
}

2.ik_smart

会做最粗粒度拆分

如果对“南京市长江大桥”采用ik_smart分词,分词结果如下:

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "南京市长江大桥"
}
{
  "tokens": [
    {
      "token": "南京市",
      "start_offset": 0,
      "end_offset": 3,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "长江大桥",
      "start_offset": 3,
      "end_offset": 7,
      "type": "CN_WORD",
      "position": 1
    }
  ]
}

6.倒排索引

(1)正向索引(forward index)

        在搜索引擎中每个文件都对应一个文件ID,文件内容被表示为一系列关键词的集合。

例如“文档1”经过分词,提取了20个关键词,每个关键词都会记录它在文档中的出现次数

和出现位置。

(2)正向索引结构

 文档1的ID>单词1:出现次数,出现位置列表;单词2:出现次数,出现位置列表…

 一般是通过key找到value 。

如果只存在正向索引,那就需要扫描索引库中的所有文档,找出包含关键词“华为手机”的文档,再根据打分模型进行打分,排出名次呈现给用户。

(3)反向索引 (inverted index)

所以搜索引擎会将正向索引重构为倒排索引,把文件ID对应关键词的映射转化为关键词到ID的映射,从词的关键字去找文档

(4) 我在网上找的一个比较容易理解的例子如下:

    假设有一批技术书籍,编好编号如下图

如果想搜索并发相关的词,正向索引呢就会遍历表格,找到编号为1和4的两条记录。

如果采用倒排索引的话,首先会对书籍的名称进行分词,比如:Java并发编程之美,会被分词成为 java  并发 编程 , 分词之后,会存储分词和文档ID的对应关系

 这时,在倒排索引中搜索并发,就能够通过分词并发找到对应的ids编号,

 (4)参考链接,个人觉得讲解很好,很容易理解:ES原理之倒排索引 - 同济小孙 - 博客园


 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【es】基本概念理解 的相关文章

随机推荐

  • JAVA 多线程解决高并发、超时线程池耗尽问题

    第一类 问题 项目中遇到了 创建20个固定线程的线程池 在测试环境 多线程如果高并发的调用都没出现问题 但是在实际的项目中 出现了线程池内线程超时等待并将池内的线程耗尽 导致其它的程序走到多线程调用时候出现了执行慢 线程无法执行问题 问题原
  • 31_谈谈你对线程安全的理解?(重点)

    如果这个是面试官直接问你的问题 xff0c 你会怎么回答 xff1f 一个专业的描述是 xff0c 当多个线程访问一个对象时 xff0c 如果不用进行额外的同步控制或其他的协调操作 xff0c 调用这个对象的行为都可以获得正确的结果 xff
  • MariaDB 数据类型

    MariaDB 数据类型 数字数据类型 MariaDB支持的数字数据类型如下 类型描述TINYINT此数据类型表示落入 128到127的有符号范围内的小整数 xff0c 以及0到255的无符号范围 BOOLEAN此数据类型将值0与 fals
  • DBSCAN算法(python代码实现)

    DBSCAN 上次学了kmeans基于划分的方法 xff0c 这次学一个基于密度的聚类算法 xff1a DBSCAN xff08 Density Based Spatial Clustering of Applications with N
  • vs2022(缺少MFC,无法新建项目,控件无法添加事件)的解决

    最近下载安装了最新的vs2022社区版 xff0c 想着把之前的c 43 43 项目能够兼容 xff0c 于是遇到了一些列问题 缺少MFC xff0c 无法新建项目 xff0c 控件无法添加事件 这里首先要吐槽一下 xff1a 也许是我电脑
  • C#多线程加载控件界面卡死的解决

    先听一个故事 xff1a 有一个老板忙不过来 xff0c 于是招一个员工去负责某些事务 这样老板就可以腾出时间处理其它事 后来发现员工干不下去 xff0c 原因是干活需要花费 xff0c 没有老板的认可 xff0c 财务不给批钱 这是原则
  • vs2022账户无法登录的解决

    因为昨天重做系统 xff0c 重装了vs2022 xff0c 又涉及到登录的问题 xff0c 一时想不起来之前怎么解决的了 xff0c 想起来以后决定还是记录下来 我遇到的问题是下面这样的 xff0c 提示脚本错误 xff0c 要求升级最新
  • 使用centos7+bind9构建内网私有dns

    有这样一种场景 xff0c 局域网内有一个为网内用户提供服务的机器 xff0c 我们希望像访问互联网站点一样去访问它 xff0c 而不用记忆ip地址和端口 xff0c 比如在web浏览器地址栏输入http www nx com就可以访问它
  • PowerBuilder制作纸牌游戏

    本文记录的是2001年我大三那年假期制作小游戏的思路 xff0c 希望给在读计算机专业的朋友们一些参考 xff0c 如果还没来得及动手尝试的同学 xff0c 一定要勇于动手 你们一定比我做得更好 制作动力 xff1a 我有一个好朋友 xff
  • 【Qt线程-1】this,volatile,exec(),moveToThread()

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 xff1a Qt线程 2 事件循环 xff08 QCoreApplication processEvents xff0c exec xff09 的应用 Qt线程 3 使
  • 【Qt线程-2】事件循环(QCoreApplication::processEvents,exec)的应用

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 Qt线程 1 this xff0c volatile xff0c exec xff0c moveToThread Qt线程 3 使用事件循环 xff0c 信号 xff0
  • 【Qt线程-4】事件循环嵌套,BlockingQueuedConnection与QWaitCondition比较

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 xff1a Qt线程 1 this xff0c volatile xff0c exec xff0c moveToThread Qt线程 2 事件循环 xff08 QCo
  • 【Qt样式(qss)-3】几套配色方案

    背景 xff1a 之前写过有关qss的博客 xff0c 记录了如何使用qt手册 xff0c 以及在项目中如何使用qss的体验 经过实践 xff0c 我归纳了自己需要的qss使用方法 xff0c 使之尽量高效 xff0c 容易维护 Qt样式
  • 【Qt样式(qss)-4】应用到QMdiArea不生效的解决

    背景 xff1a 之前写记录过几篇qss相关内容 xff1a Qt样式 xff08 qss xff09 1 手册小结 xff08 附例 xff1a 软件深色模式 xff09 Qt样式 xff08 qss xff09 2 使用小结 xff08
  • Google play billing(Google play 内支付) 下篇

    开篇 xff1a 如billing开发文档所说 xff0c 要在你的应用中实现In app Billing只需要完成以下几步就可以了 第一 把你上篇下载的AIDL文件添加到你的工程里 xff0c 第二 把 lt uses permissio
  • Qt creator中操作QAction加入QToolBar

    背景 xff1a 个人笔记 我之前没有系统化学习过任何资料 xff0c 使用很多工具都是按需出发 xff0c 直接上手 xff0c 遇到问题再研究的 所以会有一些弯路 本文言语中难免有对个人情绪的生动描述 xff0c 希望不要影响读者心情
  • Java 通过map构造树形结构

    在开发中 xff0c 经常会有将 数据组装成为树形结构的场景 xff0c 除了可以通过递归实现 xff0c 还可以通过map 组装实现 一 xff0c 构造基本数据 import apple laf JRSUIUtils import co
  • 【无标题】es搜索基本操作

    一 xff0c 准备数据 1 创建索引 PUT lagou book 2 创建mapping PUT lagou book doc mapping 34 properties 34 34 description 34 34 type 34
  • 【ES】常用操作工具

    工欲善其事 xff0c 必先利于器 xff0c es使用过程中 xff0c 有些工具能帮助我们快速的上手和使用 一 es head es head 是一款专门针对 es的客户端工具elasticSearch配置包 是一个基于node js的
  • 【es】基本概念理解

    一 xff0c 初识es 1 是什么 xff1f ElasticSearch 简称es 开源的分布式的全文搜索引擎 xff0c 可以近乎实时的存储检索数据 xff0c es使用java开发 xff0c 并且使用Lucene作为核心实现搜索功