最近项目组安排了一个任务,项目中用到了基于Solr的全文搜索,但是该Solr搜索云项目不稳定,经常查询不出来数据,需要手动全量同步。
而且它还是其他团队在维护,依赖性太强,导致Solr服务一出问题,我们的项目也基本瘫痪,因为所有的依赖查询都无结果数据了。
所以考虑开发一个适配层,如果Solr搜索出问题,自动切换到新的搜索ES。其实可以通过Solr集群或者服务容错等设计来解决该问题。
但是先不考虑本身设计的合理性,领导需要开发,所以我开始踏上了搭建ES服务的道路,从零开始,因为之前完全没接触过ES,所以通过本系列来记录下自己的开发过程。
本篇文章的总体内容大致如下图:
由ReyCG精心绘制并提供
什么是全文搜索什么是全文搜索引擎?百度百科中的定义:
全文搜索引擎是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
从定义中我们已经可以大致了解全文检索的思路了,为了更详细的说明,我们先从生活中的数据说起。
我们生活中的数据总体分为两种:
结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据:非结构化数据又可称为全文数据,指不定长或无固定格式的数据,如邮件,Word文档等。
当然有的地方还会有第三种:半结构化数据,如XML,HTML等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。
根据两种数据分类,搜索也相应的分为两种:结构化数据搜索和非结构化数据搜索。
对于结构化数据,我们一般都是可以通过关系型数据库(MySQL,Oracle等)的table的方式存储和搜索,也可以建立索引。
对于非结构化数据,也即对全文数据的搜索主要有两种方法:
顺序扫描
全文检索
顺序扫描:通过文字名称也可了解到它的大概搜索方式,即按照顺序扫描的方式查询特定的关键字。
例如给你一张报纸,让你找到该报纸中“RNG”的文字在哪些地方出现过。你肯定需要从头到尾把报纸阅读扫描一遍,然后标记出关键字在哪些版块出现过以及它的出现位置。
这种方式无疑是最耗时的最低效的,如果报纸排版字体小,而且版块较多甚至有多份报纸,等你扫描完你的眼睛也差不多了。
全文检索:对非结构化数据顺序扫描很慢,我们是否可以进行优化?把我们的非结构化数据想办法弄得有一定结构不就行了吗?
将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。
这种方式就构成了全文检索的基本思路。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。
还以读报纸为例,我们想白癜风科学治疗北京哪家医院白癜风做的好