🗒️ElasticSearch学习记录
00 分钟
2024-9-22
2024-9-22
type
status
date
summary
slug
tags
category
password
URL
icon

常用字段类型

Text

支持全文检索,可以包含多个关键词,默认会被分词器分词;

KeyWord

用于准确检索,不会被分词器分词,而是作为一个整体进行索引;

Long/Integer/Short/Byte/Double/Float/Half_Float

用于存储数值,选择合适的类型可以减少内存占用;数值类型支持范围查询、聚合操作和排序,

Date

用于存储日期和时间,支持日期的排序和聚合。

Boolean

用于存储布尔值

Binary

用于存储二进制数据

IP

用于存储IP地址

Multi-field

用于在一个字段上定义多个类型
如果我们使用keyWord存储一个数值,那么这个值会被ES按照字符串来处理。如果我们想进行聚合、范围查询或者数值排序操作,keyWord字段就无法支持或者说性能比较差。

ES的底层是什么?为什么不直接使用Lucene?

ES底层是使用Lucene实现的,Lucene是一个高效的索引与搜索库,但是它的使用成本比较高,所以有人基于Lucene使用Java封装了一系列的Restful API,这就是ES的来源。ES相比于Lucene,降低了使用成本。

ES的常见概念

  • Near Realtime(NRT) 近实时。数据提交索引后,几乎立马就可以搜索到。
  • Cluster集群,一个集群由一个唯一的名字标识,默认为“elasticsearch”。集群名称非常重要,具有相同集群名的节点才会组成一个集群。集群名称可以在配置文件中指定。
  • Node 节点:存储集群的数据,参与集群的索引和搜索功能。像集群有名字,节点也有自己的名称,默认在启动时会以一个随机的UUID的前七个字符作为节点的名字,你可以为其指定任意的名字。通过集群名在网络中发现同伴组成集群。一个节点也可是集群。
  • Index 索引: 一个索引是一个文档的集合(等同于solr中的集合)。每个索引有唯一的名字,通过这个名字来操作它。一个集群中可以有任意多个索引。
  • Document 文档:被索引的一条数据,索引的基本信息单元,以JSON格式来表示。
  • Shard 分片:在创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上。
  • Replication 备份: 一个分片可以有多个备份(副本)

ES全文检索性能比较好的核心是什么?

ES全文检索效果比较好的主要原因是倒排索引的存在。我们都知道索引的存在是为了加速数据的查询。MySQL中索引是通过B+树实现的,如果我们使用MySQL来进行全文检索,那么我们只能通过模糊匹配的方式进行查询,由于不走索引,因此会造成整体遍历。
而ES中,由于支持倒排索引,因此对于全文检索,其性能要比MySQL好很多。那我们看下什么是倒排索引。我们将数据存入到ES中时,会对text类型的字段值进行分词处理,然后将分好的词与单词所在原文的映射关系保存起来(使用FST算法保存);在查询的时候,将待查询的内容进行分词,然后将每个单词在FST算法形成的图结构中获取到docId,基于DocId再获取到原始文本,最后对获取到的原始文本信息进行聚合返回。
 
 
上一篇
数据增强——在图片中添加遮挡物
下一篇
ThreadLocal里的变量一定是线程独享的吗?