php 搜索引擎优化(全文搜索什么是全文搜索引擎?搜索云项目不稳定)

优采云 发布时间: 2021-11-26 21:06

  php 搜索引擎优化(全文搜索什么是全文搜索引擎?搜索云项目不稳定)

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

  而且还是由其他队伍维护,依赖性太强了。Solr服务一出故障,我们的项目就基本瘫痪了,因为所有的依赖查询都没有结果数据。

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

  但是不管设计本身的合理性,leader需要开发,所以我开始搭建ES服务,从头开始,因为之前没接触过ES,所以通过这个系列记录了我的开发过程。

  本文文章的整体内容大致如下:

  

  仟侑

  由 ReyCG 精心绘制和提供

  什么是全文搜索

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

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

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

  在我们的生活中有两种类型的数据:

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

  非结构化数据:非结构化数据也可称为全文数据,是指可变长度或格式的数据,如电子邮件、Word文档等。

  当然,有些地方还会有第三种:半结构化数据,如XML、HTML等,可以根据需要处理为结构化数据,也可以提取纯文本作为非结构化数据处理。

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

  对于结构化数据,我们一般可以通过关系数据库(MySQL、Oracle等)的表进行存储和搜索,或者创建索引。

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

  顺序扫描

  全文检索

  顺序扫描:也可以通过文字名称知道一般的搜索方式,即在顺序扫描中搜索特定的关键字。

  比如给你一份报纸,找出报纸上“RNG”这个词出现在什么地方。您肯定需要从头到尾扫描报纸,然后标记关键字出现的部分以及出现的位置。

  这种方法无疑是最耗时、效果最差的。如果报纸排版小,版面比较多,甚至是多份报纸,扫一眼后几乎是一样的。

  全文搜索:非结构化数据的顺序扫描很慢。我们可以优化它吗?想办法让我们的非结构化数据有一定的结构还不够吗?

  对非结构化数据中的部分信息进行提取、重组,使其具有一定的结构,然后对具有一定结构的数据进行搜索,从而达到比较快速搜索的目的。

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

  以阅读报纸为例。我们要关注英雄联盟S8全球总决赛的消息。如果我们都是RNG的粉丝,如何快速找到RNG新闻的报纸和栏目?

  全文检索法是从所有报纸的所有版块中提取关键词,如“EDG”、“RNG”、“FW”、“战队”、“英雄联盟”等。

  然后对这些关键词进行索引,通过索引我们可以对应出现在关键词中的报纸和栏目。注意目录搜索引擎之间的区别。

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

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

  事实上,我们的大部分查询功能都可以通过数据库查询获得。如果查询效率低,还可以通过建立数据库索引、优化SQL,甚至引入缓存来加快数据返回来提高效率。

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

  数据类型

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

  比如谷歌和百度之类的网站搜索都是根据网页中的关键字生成索引的。当我们在搜索时输入关键字,他们会返回所有与关键字匹配的网页,即索引;常见项目中的应用日志搜索等。

  对于这些非结构化数据文本,关系数据库搜索没有得到很好的支持。

  索引维护

  在一般的传统数据库中,全文搜索是很鸡肋的,因为一般没有人使用数据清单文本字段。

  全文搜索需要扫描整个表。如果数据量很大,即使优化了SQL语法,也收效甚微。

  索引建立了,但是维护起来也很麻烦。将为插入和更新操作重建索引。

  何时使用全文搜索引擎:

  搜索到的数据对象是大量的非结构化文本数据。

  文件记录数达到数十万或数百万甚至更多。

  支持大量基于交互式文本的查询。

  需要非常灵活的全文搜索查询。

  对高度相关的搜索结果有特殊需求,但没有可用的关系数据库来满足它们。

  对不同记录类型、非文本数据操作或安全事务处理的要求相对较少的情况。

  Lucene、Solr、ElasticSearch?

  目前主流的搜索引擎大概有:Lucene、Solr、ElasticSearch。

  

  仟侑

  他们的索引创建是根据倒排索引的方法来生成索引的,什么是倒排索引?

  维基百科:倒排索引(英文:Inverted index),也常被称为倒排索引、倒排文件或倒排文件,是一种索引方法,用于在全文搜索下存储文档中的某个词或一个存储位置的映射。一套文件。它是文档检索系统中最常用的数据结构。

  琉森

  Lucene 是一个 Java 全文搜索引擎,完全用 Java 编写。Lucene 不是一个完整的应用程序,而是一个代码库和 API,可轻松用于向应用程序添加搜索功能。Lucene 通过简单的 API 提供了强大的功能:

  可扩展的高性能指标:

  在现代硬件上超过 150GB/小时。

  RAM 要求小,只有 1MB 堆。

  增量索引与批量索引一样快。

  索引大小约为索引文本大小的 20-30%。

  强大、准确、高效的搜索算法:

  排名搜索:首先返回最好的结果。

  许多强大的查询类型:短语查询、通配符查询、邻近查询、范围查询等。

  现场搜索(例如标题、作者、内容)。

  按任何字段排序。

  将组合结果用于多索引搜索。

  允许同时更新和搜索。

  灵活的分面、突出显示、连接和结果分组。

  快速、内存效率和容错建议。

  可插拔排名模型,包括向量空间模型和 Okapi BM25。

  可配置的存储引擎(编*敏*感*词*)。

  跨平台解决方案:

  在 Apache 许可下作为开源软件提供,允许您在商业和开源程序中使用 Lucene。

  100% 纯 Java。

  其他可用编程语言的实现与索引兼容。

  Apache 软件基金会:

  从 Apache 社区获得对 Apache 软件基金会提供的开源软件项目的支持。

  但是Lucene只是一个框架。要充分利用其功能,需要使用Java,并在程序中集成Lucene。

  理解它是如何工作的需要大量的学习和理解,而要熟练地使用 Lucene 确实很复杂。

  索尔

  Apache Solr 是一个基于名为 Lucene 的 Java 库的开源搜索平台。它以用户友好的方式提供 Apache Lucene 搜索功能。

  作为近十年的行业参与者,是一款成熟的产品,拥有强大而广泛的用户群体。

  它提供分布式索引、复制、负载平衡查询以及自动故障转移和恢复。如果部署得当,管理得当,它可以成为一个高度可靠、可扩展、容错的搜索引擎。

  许多互联网巨头,例如 Netflix、eBay、Instagram 和亚马逊 (CloudSearch) 都使用 Solr,因为它可以索引和搜索多个站点。

  主要功能列表包括:

  研究所有

  突出

  分面搜索

  实时索引

  动态集群

  数据库集成

  NoSQL 功能和丰富的文档处理(如 Word 和 PDF 文件)

  弹性搜索

  Elasticsearch 是一个开源(Apache 2 许可)、基于 Apache Lucene 库的 RESTful 搜索引擎。

  Elasticsearch 是在 Solr 几年后推出的。它提供了一个分布式、多租户全文搜索引擎,带有 HTTP Web 接口(REST)和非结构化 JSON 文档。

  Elasticsearch 的官方客户端库提供 Java、Groovy、PHP、Ruby、Perl、Python、.NET 和 Javascript。

  分布式搜索引擎收录的索引可以分为段,每个段可以有多个副本。

  每个 Elasticsearch 节点可以有一个或多个分片,它的引擎也可以充当协调器,将操作委托给正确的分片。

  Elasticsearch 可以通过近乎实时的搜索进行扩展。它的主要功能之一是多​​租户。主要功能列表包括:

  分布式搜索

  多租户

  分析搜索

  分组和聚合

  Elasticsearch 与 Solr 的选择

  由于Lucene的复杂性,一般很少将其作为搜索的首选。有的公司需要开发自研的搜索框架,底层需要依赖Lucene。

  那么在这里我们重点讨论哪个更好?它之间有什么不同?你应该使用哪一个?

  

  仟侑

  历史比较

  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 都在快速发展,所以,不多说,我们来看看它们之间的差异列表:

  

  仟侑

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线