搜索引擎优化pdf(全文搜索首先搞清楚第一个问题的开发过程及解决办法!)
优采云 发布时间: 2021-12-30 00:09搜索引擎优化pdf(全文搜索首先搞清楚第一个问题的开发过程及解决办法!)
最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索Solr
但是Solr搜索云项目不稳定,经常查询不到数据。需要手动全量同步,由其他团队维护。依赖性太强了。Solr 服务一旦出现故障,我们的项目就因为所有的依赖关系而基本瘫痪。查询没有结果数据。
所以考虑开发一个适配层,如果Solr搜索有问题,自动切换到新的搜索:ElasticSearch(ES)
其实这个问题可以通过Solr集群或者服务容错设计来解决。但是不管设计本身的合理性,leader需要开发,所以我从头开始搭建ES服务,因为之前没接触过ES,所以通过这个系列记录了我的开发过程。
什么是全文搜索
首先澄清第一个问题:什么是全文搜索引擎?
百度百科中的定义:
全文搜索引擎是目前应用广泛的主流搜索引擎。其工作原理是计算机索引程序扫描文章中的每个词,为每个词建立索引,并指示该词在文章中的编号和位置。
当用户进行查询时,搜索程序会根据预先建立的索引进行搜索,并将搜索结果反馈给用户的搜索方法。这个过程类似于通过字典中的搜索词列表查找字符的过程。
从定义上,我们已经可以大致了解全文检索的思想了。为了更详细的讲解,先从生活中的数据说起。
在我们的生活中有两种类型的数据:结构化数据和非结构化数据。
当然,有些地方还会有第三种:半结构化数据,如XML、HTML等,可以根据需要处理为结构化数据,也可以提取纯文本作为非结构化数据处理。
根据两类数据分类,搜索也分为两类:
对于结构化数据,我们一般可以通过关系数据库(mysql、oracle等)的表进行存储和搜索,或者创建索引。对于非结构化数据,即搜索全文数据,主要有两种方法:顺序扫描法、全文搜索法
顺序扫描:也可以通过文字名称知道一般的搜索方式,即在顺序扫描中搜索特定的关键字。
比如给你一份报纸,找出报纸上“RNG”这个词出现在什么地方。您肯定需要从头到尾扫描报纸并标记关键字出现的部分和出现的位置。
这种方法无疑是最耗时、效果最差的。如果报纸的排版很小,而且有很多版块甚至是多份报纸,你扫了一眼就差不多了。
全文搜索:非结构化数据的顺序扫描很慢。我们可以优化它吗?想办法让我们的非结构化数据有一定的结构还不够吗?
我们将非结构化数据中的部分信息提取出来,重新组织起来,使其具有一定的结构,然后搜索具有一定结构的数据,从而达到比较快速搜索的目的。
这种方式构成了全文检索的基本思想。这部分信息是从非结构化数据中提取出来然后重新组织起来的,我们称之为索引。
以阅读报纸为例。我们要关注最近英雄联盟S8全球总决赛的消息。如果我们都是RNG的粉丝,如何快速找到RNG新闻的报纸和栏目?
全文检索法:从所有报纸的所有版块中提取关键词,如“EDG”、“RNG”、“FW”、“团队”、“英雄联盟”等,然后对这些关键词进行索引,并通过索引,我们可以对应出现在关键词中的报纸和栏目。
为什么要使用全文搜索引擎
那么第二个问题是,为什么要使用搜索引擎?
我们所有的数据都在数据库中,Oracle、SQL Server等数据库也可以提供查询检索或聚类分析功能。直接通过数据库查询还不够吗?
事实上,我们的大部分查询功能都可以通过数据库查询来获得。如果查询效率低,还可以通过建立数据库索引、优化SQL等方式来提高效率,甚至可以通过引入缓存来加快数据返回速度。如果数据量较大,可以拆分数据库和表来分担查询压力。
那为什么还需要全文搜索引擎呢?我们主要分析以下原因:
第三个问题:什么时候使用全文搜索引擎?
搜索到的数据对象是大量的非结构化文本数据。文件记录数达到数十万或数百万甚至更多。支持大量基于交互式文本的查询。具有非常灵活要求的全文搜索查询。对高度相关的搜索结果有特殊要求,但没有可用的关系数据库来满足这些要求。对不同记录类型、非文本数据操作或安全事务处理的要求相对较少的情况。Lucene、Solr 还是 ElasticSearch?
目前主流的搜索引擎大概有:Lucene、Solr、ElasticSearch。
他们的索引创建是根据倒排索引的方法来生成索引的,什么是倒排索引?
我们先来看看维基百科的解释:
维基百科
倒排索引(英文:Inverted index),也常被称为倒排索引、倒排文件或倒排文件,是一种索引方法,用于在全文搜索下存储文档或组中的某个词 存储的映射文档中的位置。它是文档检索系统中最常用的数据结构。
接下来,我们就来看看这三种主流的使用倒排索引的全文搜索引擎。
琉森
Lucene 是一个 Java 全文搜索引擎,完全用 Java 编写。Lucene 不是一个完整的应用程序,而是一个代码库和 API,可轻松用于向应用程序添加搜索功能。
Lucene 通过简单的 API 提供了强大的功能:
可扩展的高性能索引
强大、准确、高效的搜索算法
跨平台解决方案
但是Lucene只是一个框架。要充分利用其功能,需要使用JAVA,并在程序中集成Lucene。理解它是如何工作的需要大量的学习和理解,而要熟练地使用 Lucene 确实很复杂。
索尔
Apache Solr 是一个基于名为 Lucene 的 Java 库的开源搜索平台。它以用户友好的方式提供了Apache Lucene的搜索功能。
它提供分布式索引、复制、负载平衡查询以及自动故障转移和恢复。如果部署得当,管理得当,它可以成为一个高度可靠、可扩展、容错的搜索引擎。
许多互联网巨头,如 Netflix、eBay、Instagram 和亚马逊 (CloudSearch) 都使用 Solr,因为它能够索引和搜索多个站点。
主要功能列表包括:
弹性搜索
Elasticsearch 是一个基于 Apache Lucene 库的开源 RESTful 搜索引擎,在 Solr 几年后推出。
它提供了一个分布式、多租户全文搜索引擎,带有 HTTP Web 接口(REST)和非结构化 JSON 文档。
Elasticsearch 的官方客户端库提供 Java、Groovy、PHP、Ruby、Perl、Python、.NET 和 Javascript。
分布式搜索引擎收录
的索引可以分为段,每个段可以有多个副本。每个 Elasticsearch 节点可以有一个或多个分片,它的引擎也可以充当协调器,将操作委托给正确的分片。
Elasticsearch 可以通过近乎实时的搜索进行扩展。它的主要功能之一是多租户。主要功能列表包括:
Elasticsearch vs. Solr,如何选择?
由于Lucene的复杂性,一般很少将其作为搜索的首选。排除部分公司需要自己开发搜索框架,底层需要依赖Lucene。所以这里我们重点分析Elasticsearch和Solr。
Elasticsearch 与 Solr。哪一个更好?它们有何不同?你应该使用哪一个?
历史比较
Apache Solr 是一个成熟的项目,拥有庞大而活跃的开发和用户社区,以及 Apache 品牌。Solr 于 2006 年首次发布开源。它长期以来一直统治着搜索引擎领域,是任何需要搜索功能的人的首选引擎。
它的成熟转化为丰富的功能,而不仅仅是简单的文本索引和搜索;如分面、分组、强大的过滤、可插入的文档处理、可插入的搜索链组件、语言检测等。
Solr 多年来一直统治着搜索领域。然后,在 2010 年左右,Elasticsearch 成为市场上的另一种选择。当时,它远不如 Solr 稳定,没有 Solr 的功能深度,没有分享想法,品牌等。
Elasticsearch虽然很年轻,但也有自己的一些优势。Elasticsearch 建立在更现代的原则之上,针对更现代的用例,旨在更轻松地处理大型索引和高查询率。
另外,因为它太年轻,没有社区可以合作,它可以在没有任何共识或与其他人(用户或开发者)合作,向后兼容,或任何其他更成熟的软件通常必须处理的情况下自由前进。
所以在Solr之前就公开了一些非常流行的功能(比如near real-time search,英文:Near Real-Time Search)。
从技术上讲,NRT 搜索的能力确实来自 Lucene,它是 Solr 和 Elasticsearch 使用的基本搜索库。
讽刺的是,因为 Elasticsearch 首先公开了 NRT 搜索,人们将 NRT 搜索与 Elasticsearch 联系起来,尽管 Solr 和 Lucene 都是同一个 Apache 项目的一部分,所以人们首先会期望 Solr 有如此苛刻的功能。
功能差异对比
这两个搜索引擎都是流行的高级开源搜索引擎。它们都是围绕核心底层搜索库-Lucene构建的
但它们是不同的。像所有事物一样,每个事物都有其优点和缺点,并且根据您的需求和期望,每个事物都可能更好或更糟。
那么,话不多说,先来看看不同之处:
综合比较
另外,我们从以下几个方面进行分析:
总结
所以问题是,它是 Solr 还是 Elasticsearch?
很难找到明确的答案。无论您选择 Solr 还是 Elasticsearch,您首先需要了解正确的用例和未来的需求。总结它们的每个属性。记住:
总之,两者都是功能丰富的搜索引擎,只要设计和实现得当,它们都可以提供或多或少相同的性能。本文整体内容大致如下图所示,由园友ReyCG精心绘制和提供。
欢迎工作一到五年的Java工程师加入Java程序员的开发:721575865
本群免费提供Java架构学习资料(高可用、高并发、高性能和分布式、JVM性能调优、Spring源码、MyBatis、Netty、Redis、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等框架知识点)合理利用自己的时间分分秒秒地学习提升自己,不要用“没时间”来掩饰自己的精神懒惰!趁年轻努力,给未来的自己一个交代!