互联网搜索核心组件:Lucene 20 岁生日啦

2020-05-28 00:00:00 索引 数据 集群 多个 节点



前言

你用过Elasticsearch么?那你知道Elasticsearch底层是基于什么技术演化而来的么?相信用过ES并深入了解过ES的都知道,ES是基于Lucene,隐藏复杂性,提供简单易用的restful api接口、java api接口、其他语言的接口。现在Lucene从诞生到现在已经20年了,Happy Birthday , Lucene!ES官网还特意为Lucene庆生,链接:https://www.elastic.co/cn/celebrating-lucene 。

ES作者基于Lucene的传说

关于elasticsearch的一个传说,有一个程序员失业了,陪着自己老婆去英国伦敦学习厨师课程。程序员在失业期间想给老婆写一个菜谱搜索引擎,觉得lucene实在太复杂了,就开发了一个封装了lucene的开源项目,compass。后来程序员找到了工作,是做分布式的高性能项目的,觉得compass不够,就写了elasticsearch,让lucene变成分布式的系统。今天我们乘着Lucene的20岁生日一起温习一下Lucene和ES的核心概念。

Lucene 的核心概念

  1. IndexWriter

lucene中重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。

  1. Analyzer

分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

  1. Directory

索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。

  1. Document

文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。

  1. Field

类似于数据库中的一个字段,存储了key-value值。

  1. IndexSearcher

是lucene中基本的检索工具,所有的检索都会用到IndexSearcher工具;

  1. Query

Query类似关系型数据库中的SQL语句。与关系型数据库类似,Lucene提供了以下的基本查询:查询xxx = ? TermQuery、范围查询 xxx BETWEEN? AND ? PointRangeQuery、模糊查询 xxx LIKE ‘%?%’ PrefixQuery、RegexpQuery、组合查询 (…) AND (…) OR (…) BooleanQuery

  1. QueryParser

是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。

  1. Hits

在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在Lucene中,搜索的结果的集合是用Hits类的实例来表示的。

ES 的核心概念

  1. Near Realtime(NRT):近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级

  2. Cluster:集群,包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常。

  3. Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群

  4. Document&field:文档,es中的小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document。一个document里面有多个field,每个field就是一个数据字段。

  5. Index:索引,包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document。

  6. Type:ES 7.x 版本已经废除Type,关于为什么取消,可以参考 :https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-*.html 类型,每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。

  7. shard:单台机器无法存储大量数据,es可以将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。

  8. replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,因此可以为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。primary shard(建立索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每个索引10个shard,5个primary shard,5个replica shard,小的高可用配置,是2台服务器。

 


❤️给个「在看」,是大的支持❤️

相关文章