先来聊聊lucene;lucene对es影响最大的一点就是倒排索引。
倒排索引是为每个单词建立一个记录,列出包含该单词的所有文档。这样在搜索时,只需查找单词对应的记录即可快速定位包含该单词的所有文档。从而实现高性能全文搜索。此外,lucene底层还实现了复杂的评分与排序算法,丰富的分词器和分析器。缺点也很明显,太难用了。直接使用它需要大量的配置工作。而es则实现了更高层次的抽象功能,使得用户可以很方便的实现复杂的搜索分析需求,易用性更强。比如通过简单直观的restful api,通过http请求进行操作,支持复杂的DSL查询语句。
再来看它的基本架构,
首先是集群,集群是由一个或多个节点组成的集合,集群中的节点协同工作。
其次是节点,节点就是一个运行的es实例,可以是主节点,数据节点,协调节点之类。
然后是索引,可以看作是一个数据库,有多个类型相似的文档。
类型相当于是关系型数据库里的表,在我用的版本已经被弃用,但是postman里面还是有它的影子。
最后是字段,字段相当于是列,也就是每个字段对应的值。
最后来看工作原理,当我们把数据发送给es时,这些数据会被封存在一个名为索引的结构中,索引中包括多个文档,每个文档都是json格式的数据对象。文档存储在索引的分片里,每一个分片是一个独立的llucene索引。es自动将文档分配到不同的分片里,并配置分片的副本以提高可用性。除此以外,我们前面有提过的倒排索引将文档中的词项映射到文本的id中,也就是这些词出现在哪些文档中。这样就可以实现快速的查询。
数据写入流程如下:客户端发送http请求,将文档写入es中,然后es集群根据索引的路由算法,将请求路由到负责处理该文档的主分片中,随后复制到所有副本分片中。
数据查询流程如下:客户端发送一个http请求,包含查询的dsl,es的协调节点解析查询dsl,将查询请求发给对应的分片,然后分片搜索,将匹配的结果返回给协调分片。协调分片进行结果的合并,并返回结果给客户端。
集群管理:es集群由多个节点构成,每个节点都是独立的es实例。主节点负责管理集群的状态,包括索引的创建删除更新等操作。索引被切割成多个分片,每个分片在不同的节点上,用于提高可用性。主节点检测到节点故障时,要分配故障节点的分片给其他的可用节点。
你是如何设计和创建索引的?索引结构是怎样的?
索引主要是为了搜索帖子和评论的关键词,所以对应的字段就是标题,内容,作者id,时间戳等等。
然后要定义映射,标题和内容全文搜索需要文本类型和标准分析器。时间戳则是使用日期类型并定义日期格式。
分片和副本的数量不用太多,分片数量设置为3,副本设置为1
最后写出来的代码里,title和context的analyzer是standard。作者可以用关键词,时间戳我们定义了format。