全文搜索引擎选ElasticSearch还是Solr?

  最近项目组安排了一个任务,项目中用到了基于 Solr 的全文搜索,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步。

  

  而且它还是其他团队在维护,依赖性太强,导致 Solr 服务一出问题,我们的项目也基本瘫痪,因为所有的依赖查询都无结果数据了。

  所以考虑开发一个适配层,如果 Solr 搜索出问题,自动切换到新的搜索 ES。其实可以通过 Solr 集群或者服务容错等设计来解决该问题。

  但是先不考虑本身设计的合理性,领导需要开发,所以我开始踏上了搭建 ES 服务的道路,从零开始,因为之前完全没接触过 ES,所以通过本系列来记录下自己的开发过程。

  本篇文章的总体内容大致如下图:

  

扫描二维码关注公众号,回复: 4785816 查看本文章

  由 ReyCG 精心绘制并提供

  什么是全文搜索

  什么是全文搜索引擎?百度百科中的定义:

  全文搜索引擎是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

  从定义中我们已经可以大致了解全文检索的思路了,为了更详细的说明,我们先从生活中的数据说起。

  我们生活中的数据总体分为两种:

  结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。

  非结构化数据:非结构化数据又可称为全文数据,指不定长或无固定格式的数据,如邮件,Word 文档等。

  当然有的地方还会有第三种:半结构化数据,如 XML,HTML 等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

  根据两种数据分类,搜索也相应的分为两种:结构化数据搜索和非结构化数据搜索。

  对于结构化数据,我们一般都是可以通过关系型数据库(MySQL,Oracle 等)的 table 的方式存储和搜索,也可以建立索引。

  对于非结构化数据,也即对全文数据的搜索主要有两种方法:

  顺序扫描

  全文检索

  顺序扫描:通过文字名称也可了解到它的大概搜索方式,即按照顺序扫描的方式查询特定的关键字。

  例如给你一张报纸,让你找到该报纸中“RNG”的文字在哪些地方出现过。你肯定需要从头到尾把报纸阅读扫描一遍,然后标记出关键字在哪些版块出现过以及它的出现位置。

  这种方式无疑是最耗时的最低效的,如果报纸排版字体小,而且版块较多甚至有多份报纸,等你扫描完你的眼睛也差不多了。

  全文检索:对非结构化数据顺序扫描很慢,我们是否可以进行优化?把我们的非结构化数据想办法弄得有一定结构不就行了吗?

  将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

  这种方式就构成了全文检索的基本思路。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。

  还以读报纸为例,我们想关注英雄联盟 S8 全球总决赛的新闻,假如都是 RNG 的粉丝,如何快速找到 RNG 新闻的报纸和版块呢?

  全文检索的方式就是,将所有报纸中所有版块中关键字进行提取,如"EDG","RNG","FW","战队","英雄联盟"等。

  然后对这些关键字建立索引,通过索引我们就可以对应到该关键词出现的报纸和版块。注意区别目录搜索引擎。

  为什么要用全文搜索搜索引擎

  之前,有同事问我,为什么要用搜索引擎?我们的所有数据在数据库里面都有,而且 Oracle、SQL Server 等数据库里也能提供查询检索或者聚类分析功能,直接通过数据库查询不就可以了吗?

  确实,我们大部分的查询功能都可以通过数据库查询获得,如果查询效率低下,还可以通过建数据库索引,优化 SQL 等方式提升效率,甚至通过引入缓存来加快数据的返回速度。

  如果数据量更大,就可以分库分表来分担查询压力。那为什么还要全文搜索引擎呢?我们主要从以下几个原因分析:

  数据类型

  全文索引搜索支持非结构化数据的搜索,可以更好地快速搜索大量存在的任何单词或单词组的非结构化文本。

  例如 Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。

  对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。

  索引的维护

  一般传统数据库,全文检索都实现的很鸡肋,因为一般也没人用数据库存文本字段。

  进行全文检索需要扫描整个表,如果数据量大的话即使对 SQL 的语法优化,也收效甚微。

  建立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。  郑州无痛人流多少钱:http://yyk.39.net/zz3/zonghe/1d426.html/郑州同济妇科医院:http://yyk.39.net/zz3/zonghe/1d426.html/

猜你喜欢

转载自blog.csdn.net/qq_39443136/article/details/85370116