【es】基本概念理解

一,初识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原理之倒排索引 - 同济小孙 - 博客园


 

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值