我们都知道Elasticsearch是一个全文检索引擎,那么它是如何实现快速的检索呢?
传统的数据库给每个字段都存储成一个单个值,对于全文检索而言,这样的存储是低效的。举个例子,我有一个大文本字段,存到数据库里面只能是一个值,如果想要检索这个大文本字段里面的任何一个词,数据库如何实现? 只能通过like模糊查询来实现,先不说性能低,这对于一个搜索引擎是远远不够的。
针对上面数据库的不足,所以才出现了Lucene这种全文检索框架而它的核心就在于采用了倒排索引(Inverted Index)的数据结构,不同于数据库的行式存储,Lucene这里采用了列式存储的方式故而对单个字段可以支持多个值的存储,这就是倒排索引。
````
Term | Doc 1 | Doc 2 | Doc 3 | ...
------------------------------------
brown | X | | X | ...
fox | X | X | X | ...
quick | X | X | | ...
the | X | | X | ...
````
如上图所示,倒排索引的一个字段由多个Term组成,这些Term是一个有序的列表,并且是唯一不重复的。对于每一个Term又会映射上所有包含该Term的Document Id列表。
为什么谈到Lucene,因为Lucene本身只是一个全文检索工具包,它不具备企业级的一些特性,如分布式,副本,扩展等而Elasticsearch和Solr都是基于Lucene开发和扩展的企业级框架,所以了解Lucene对学习Elasticsearch和Solr会有很大帮助。
在Elasticsearch中每条数据都是一个json,实际上json中每一个字段都有它自己的倒排索引结构。
当然倒排索引中的每个Term保存的信息还有很多,比如这个Term在多少个Doucuments里面出现过的次数,在特定的Doucument里面出现的次数,每个Document的length,所有Document的平均length,这些信息是用来计算搜索的相关性(Relevance),我们都知道使用google和百度搜索结果后,数据会有个先后排名,排名靠前的基本都是最相关的数据,那么那些因素决定了数据的排名? 这里面其实就是上面所说的相关性来决定,关于相关性的计算方式也是Lucene里面的核心功能,目前Lucene里面主要有两种Rank算法:
(1)经典的基于VSM向量空间的TF/IDF算法
(2)最新的基于概率论的BM25算法
刚兴趣的朋友可以去维基百科学习一下,这里不再展开了。
早期的全文检索所有的数据都会被做成一个大的倒排索引,当新索引准备好之后,它会替代旧的大索引并且最近的变化数据可以被检索。
这个大的倒排索引有一个最大的特点就是不可变性,只要索引被写入磁盘后,就是不可变的:
优点:
(1)由于不可变性,所以不需要锁,也就是不存多个线程同时去修改数据。
(2)可以直接把索引加载到FileSystem Cache停留在cache中,因为它不会被修改并且FileSystem Cache有足够大的空间,这样以来直接在内存中查询代替在磁盘上,对搜索性能大大提升。
(3)其他的缓存如filter cache在整个index的生命周期内都是有效的,他们不会被重建,因为索引是不可变的。
(4)不可变的大索引可以得到更高的压缩比,这样以来能够节省io和占用的内存资源
缺点:
倒排索引的优点也是它的缺点,因为它不可变,所以为了使你新增的数据能够正常的搜索到,你需要重建整个索引,这严重限制了单个index存储的数量以及它的更新频率。
所以在Elasticsearch中采用了动态更新多个索引方式来解决这个问题,这个会在下篇的文章中介绍。
参考链接:
https://www.elastic.co/guide/en/elasticsearch/guide/master/inverted-index.html
https://www.elastic.co/guide/en/elasticsearch/guide/master/relevance-intro.html
https://www.elastic.co/guide/en/elasticsearch/guide/master/making-text-searchable.html
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
在`es服务配置非数据性结构.txt`中,可能包含了Elasticsearch集群的配置细节,如节点设置、索引模板、映射配置等。而`sprintboot-elasticsearch`可能是Spring Boot项目中的相关代码示例,包含了上述步骤的实现。 总...
Elasticsearch(ES)是一种基于Lucene的分布式、RESTful搜索和分析引擎,常用于实时大数据的检索和分析。在本场景中,我们有三个测试数据集,分别代表不同的应用场景和数据类型,它们是logstash-*,account,以及...
Elasticsearch(简称ES)是一款强大的开源搜索引擎,广泛应用于数据检索、分析和管理。作为分布式、RESTful风格的搜索和数据分析引擎,Elasticsearch能够提供实时、高可用性以及可扩展的搜索功能。在进行日常的数据...
本文将深入探讨如何利用ArcGIS桌面工具将矢量数据(如.shp文件)导入到Elasticsearch(ES)中,以便进行高效的数据存储、检索和分析。 首先,ArcGIS桌面软件提供了丰富的地理数据处理功能,其中包括支持多种矢量...
Elasticsearch 6.8.1与Kibana 6.8.1配合使用,Kibana是一个强大的数据可视化和分析平台,可以从Elasticsearch检索数据并创建交互式仪表板。您提到的“去我的下载页查看”可能是提示用户去获取Kibana的相应版本。...
在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...
springboot整合elasticsearch7,进行数据同步。elasticsearch相关度查询、排序。高亮显示;自动补全等功能。代码仅供参考,代码中有具体的注释,可以根据代码及注释内容,对自己项目架构及业务进行修改、整合。
在测试数据中,我们可能会看到每条记录都是一个JSON对象,这是Elasticsearch处理数据的基本单位,因为JSON格式便于存储和检索结构化信息。例如,每条记录可能包括“用户ID”、“用户名”、“年龄”、“购买历史”等...
在全文检索领域,Elasticsearch扮演着核心角色,它能处理大量非结构化数据,并通过自然语言处理技术提供高效的全文搜索体验。 在Spring Boot框架中整合Elasticsearch,可以极大地简化开发过程,提供一套便捷的API...
好记性不如烂笔头哦~,ElasticSearch,简称es,es是一个开源的高拓展的分布式全文搜索引擎它可以近乎实时的存储、检索数据;本身拓展性很好,可以拓展到上百台服务器,处理PB级别的数据。es也是用Java开发并使用...
最后,Kibana 从 Elasticsearch 检索数据,展示可视化结果,帮助用户分析和理解日志数据。 在实际应用中,ELK Stack 可以帮助监控系统性能、识别故障、进行安全审计、追踪用户行为等。6.3.1 版本的 ELK Stack 提供...
3. **Java API检索数据** - 配置TransportClient:首先,你需要配置TransportClient,指定集群的节点地址。例如: ```java Settings settings = Settings.builder().put("cluster.name", "your-cluster-name")....
在描述中提到,“es+springboot+mysql 实现mysql数据同步es,然后查询es数据各种demo实现”,这表明项目旨在实现在MySQL数据库和Elasticsearch之间进行数据同步,同时提供了查询Elasticsearch数据的各种示例代码。...
Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。 Elasticsearch 为所有类型的数据提供近乎实时的...
简易博客检索系统使用前后端分离,前端使用 Vue ,后端使用 SpringBoot 数据库 MySQL 检索使用 ElasticSearch 同步数据使用 logstash 基于Springboot + ElasticSearch +Vue+MySQL构建的博客检索系统 项目经过严格...
MySQL作为一款广泛应用的关系型数据库管理系统,存储了大量结构化数据,而Elasticsearch则是一款实时分布式搜索和分析引擎,适用于非结构化数据的快速检索。将MySQL中的数据同步到Elasticsearch,可以实现更高效的...
Elasticsearch是这个项目的关键,它是一个分布式、RESTful风格的搜索和数据分析引擎,特别适合进行全文检索。Elasticsearch基于Lucene库,提供了更高级别的API和集群管理能力。在这个博客系统中,Elasticsearch用于...
Elasticsearch是一款基于Lucene的开源搜索引擎,它使用RESTful接口进行数据操作,数据以JSON格式存储。Elasticsearch以其高效的全文搜索...随着大数据时代的到来,Elasticsearch在数据检索领域扮演着越来越重要的角色。
在数据抽取 ELT 领域,ES 全家桶 ELK(Elasticsearch+Logstash+Kibana)赫赫有名。 Elasticsearch 基本概念: * 倒排索引:Elasticsearch 为什么快,核心设计理念就是采用了倒排索引机制。倒排索引的方式是,根据 ...
Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。 Elasticsearch 为所有类型的数据提供近乎实时的...