【迅搜02】究竟什么是搜索引擎?正式介绍XunSearch

究竟什么是搜索引擎?正式介绍XunSearch

啥?还要单独讲一下啥是搜索引擎?不就是百度、Google嘛,这玩意天天用,还轮的到你来说?

额,好吧,虽然大家天天都在用,但是我发现,其实很多人对搜索引擎并不是特别了解,更别提搜索引擎开发了。不信?那么咱们就一步一步来看。

搜索引擎

上来先官方,看看百科中对搜索引擎的定义。

搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上采集信息,在对信息进行组织和处理后,为用户提供检索服务,将检索的相关信息展示给用户的系统。搜索引擎是工作于互联网上的一门检索技术,它指在提高人们获取搜集信息的速度,为人们提供更好的网络使用环境。从功能和原理上搜索引擎大致被分为全文搜索引擎、元搜索引擎、垂直搜索引擎和目录搜索引擎等四大类。

嗯,一堆没啥用的概念。但我们能从中看到,搜索引擎是根据策略,也就是根据我们的搜索关键词,以最快的速度返回匹配度最高的信息。然后包括全文检索、垂直搜索这两个重要的类型,我们日常开发中,需要开发的也正是这类搜索引擎。

通常来说,在数据库中,如果数据量不大,其实通过 like 就可以实现模糊匹配。这就是一种搜索实现,只不过,like 如果是前后都有 % 的,就走不了索引,数据库引擎需要对每一条数据的每一个字段里面的内容进行全部的单词匹配。如果数据量大了,那么效果可想而知。特别是如果是针对大型的文章、文献,本身字段的内容也非常长,这样匹配就更费劲了。

而搜索引擎,一般会采用倒排索引,能够大大提升词组的匹配效率,进而提升查询速度。关于倒排索引的概念我们会在后面再说。

既然提到了倒排索引,那么就要牵涉出另一个词汇,那就是分词。很多人会把搜索引擎的搜索功能和 like 混淆,这一点一定要搞清楚,如果不搞清楚,就会出现一个很大的误区。划重点了,分词+倒排索引,和 like 匹配,完全不是一个东西。

搜索引擎概念

在学习搜索引擎开发前,我们需要了解一些概念性的内容。

  • 索引:搜索引擎中的索引只有一个,那就是倒排索引。后面的文章我们会详细的说明。搜索引擎在开始使用的时候,一定都有一个建立索引的过程。

  • 分词:针对文档内容,以及查询语句,我们要将它们进行分词,如果不分词,就无法快速建立倒排索引。同时,中文分词又是非常重要的内容。

  • 引擎:百度、Google的强大引擎不提,我们日常开发中用到的主要就是 Lucene 系列的,如 ElasticSearch、Solr 等,另外还有 Sphinx 使用的基于 SQL 的搜索引擎以及我们的主角 XunSearch 所使用的 Xapian 引擎。

  • 排序/评分:我们查询了数据之后,数据是按什么顺序返回的呢?如果是数据库,可能会指定一个排序字段,但搜索引擎一般会根据相关性评分进行排序,也就是说,我们应该搜索到的是最贴近搜索词的内容,一般也是用户最想看到的内容。

  • 标点符号:基本上所有的搜索引擎都会过滤掉标点符号,最开始我还在纠结为什么我单独来个问号搜索不到内容,其实呀,搜索引擎就是为了做语义词组搜索的,标点符号在大部分情况下是没有太多意义的呀。当然,百度上面是有意义的,但咱们不能跟他比。

虽说不全面,但上面几点内容应该是比较重要的方面。其中索引、分词、排序、评分等内容我们后面还会有更详细的学习。今天我们先来了解一下引擎和框架。

XunSearch 和 Xapian

XunSearch 中文名是 迅搜 ,国人大佬开发,提供完整的 PHP SDK 组件。

不是说好了是学习 XunSearch 嘛?Xapian 是什么鬼?这个呀,其实用 ElasticSearch 和 Lucene 来解释就很清楚了。要说搜索引擎组件中的老大,ElasticSearch 可谓是一骑绝尘。如果你之前学习过 ES 相关的内容,那么 XS (后面我们就都用 XS 来指代 XunSearch 啦,就和 ES 一样)的内容学习就非常轻松了。如果你没有学习过 ES ,那也没关系,但希望你学习完我的 XS 系列之后,再去好好学习一下 ES ,因为有些东西 XS 真的是没有的,而且有些有的东西和 ES 也是没法比的。但搜索引擎的基本概念都是相通的,而且 XS 也有自身的优势。我们下一节也会说这些搜索引擎的选型以及优劣。

好了,话说回来。Lucene 是 Java 实现的一个搜索引擎,非常强大,也非常出名,但是呢,不好用。就是比较偏底层,就像是一个 JDK 或者说是原生写法去开发 PHP 应用。而 ES 则是构建在 Lucene 之上的,提供了各种方便使用的功能以及强大的 RESTFul 接口,能够方便地使用,就像是 Java 语言或者说是使用框架来开发 PHP 应用。Lucene 和 ES 的作者是同一个人。

同理,Xapian 正是我们 XS 的底层框架,XS 是建立在其之上的,通过封装提供了现成的 PHP SDK 能够让我们非常方便地使用。除了 Xapian 之外,XS 还一道封装好了 hightman 大佬开发的中文 SCWS 分词器。相当于一个 XS 就是 Xapina+SCWS+PHP SDK 的组合。是的,你没猜错,XS 也是 hightman 大佬开发的,而且到现在也一直在更新,最重要的是,这是咱们国人的,面向中文的优秀搜索引擎解决方案哦,感谢大神前辈的努力和奉献。

那么 ES 上有分词器嘛?老外开发的肯定是英文分词没问题啦。如果要使用中文的话,需要自己安装 IK 分词器或者其它分词器插件,不过 ES 的插件安装非常简单,其实也没啥难度。这里还需要注意的是一点是,即使是英文,所有的搜索引擎也会统一以小写建立索引,也就是说,搜索引擎是不区分大小写的,统一都是小写。

好了,这下应该清楚了吧,我们要学习的核心内容都有哪些。

  • 倒排索引、分词的概念与原理

  • 排序、相关度评分的算法概念

  • XS 的使用(PHP SDK工具、PHP SDK全部功能使用等)

  • SCWS、Xapian 的学习

现在知道为什么上篇文章中我会说咱们这一套文章和视频可能会是全网唯一了,因为咱们不只讲 XS 的使用,还要简单地学习一下 SCWS 和 Xapian ,并且通过这些再顺道一起学习搜索引擎相关的一些基础知识。当然,重点的核心内容肯定还是 XS 的使用咯,也就是我最擅长的带着大家一起刷文档啦!

搜索引擎选型

搜索引擎工具非常多,比如在 DBEngines 上,就能看到很多很多种。

ES 一骑绝尘这说法没毛病吧,所以我说,如果你之前学习过一点 ES ,那么看这个系列没啥压力,如果你没有学习过,那么学完 XS 后也最好再去看看。ES 最强大的部分在于天然分布式、性能强悍,现在也是大数据的标配了,上亿数据量轻松拿捏,更重要的是,它的生态好,社区活跃,这一点很重要。

除了 ES 之外,我略微了解过的还有 Solr 和 Sphinx ,其它的就不太清楚了。因此,我就主要对比这四个,大部分资料也是网上找到的。


XunSearchElasticSearchSolrSphinx
引擎XapianLuceneLucene不知道
引擎开发语言C/C++JavaJavaC/C++
应用语言PHP(Xapian支持各种语言SDK,因此其实 XS 也支持各种语言)各种语言各种语言各种语言
搜索功能支持1.全文 2.搜索建议 3.分面 4.拼音搜索 5.突出显示 6.权重微调 7.拼写检查/纠错 8.突出显示1.全文 2.自动完成建议 3.分面 4.多场 5.同义词 6.模糊 7.地理空间1.全文 2.自动完成建议 3.分面 4.多字段 5.同义词 6.模糊 7.突出显示 8.地理空间 9.拼写检查1. 全文 2. 自动完成建议 3. 分面 4. 多字段 5. 同义词(称为字形) 6. 地理空间 7. 突出显示(称为片段) 8. 拼写检查(称为qsuggest)
扩展与分布式支持主从复制天然分布式支持分布式支持主从复制
查询效率中等高,数据量越大,分布分片节点越多,与其它相比性能就越好非常高,单索引亿级也能快速搜索
增量索引支持支持支持增量支持度一般,但全量MySQL生成索引非常快,与MySQL等配合紧密
中文支持自带SCWSIK、Jieba等安装第三方分词器安装第三方分词器
资源占用
数据量级单索引百万单索引单节点千万,分布式多节点多分片没上限单索引单节点千万,分布式多节点没上限单索引亿级
开发友好极高,对我们 PHPer 来说当然是极高了,而且确实简单

好了,这些对比是不是客观全面我也不知道,反正也是网络上收集来的,不过大部分的对比文章都会提到这些。我们再拿 XS 和 ES 来总结一下,因为我更推荐的,就是只学这两个就可以了。

XS:简单好上手,中文分词友好,国人开发,文档齐备,部署方便,快速上线。唯一缺憾,没有地理空间索引,O2O相关的项目就不要考虑了。

ES:强大,排名无人可匹敌,天然分布式支持,能玩大数据的,知识体系更为庞大,除了搜索之外还有聚合计算以及分析能力,生态健全也更活跃。

为什么只推荐学习这两个呢?

  • 第一,PHPer 们大部分接触到的项目,说实话,XS 完全足够。

  • 第二,如果确实有很大的数据量,直接用最热门的,准没错。

  • 第三,XS 上手简单,学习应用速度快,和 PHP 无缝对接,分分钟上线功能。

  • 第四,ES 代表着最先进,所有的知识、插件、概念都比较新,功能齐全。

  • 第五,搜索引擎的基础知识和原理是相通的,就像数据库的原理一样,需要使用其它的学习也很快。

怎么感觉说完这一节,更想去学 ES 了,哈哈哈哈!

好吧,咱们还是要以 XS 为主哦,不过在学习过程中,我们在需要做对比的时候,也会直接使用 ES 来进行对比。比如马上我们就会说一下问题。

搜索引擎真的不是 like

上一篇文章中,我们搭起了应用环境,也插入了一些测试数据,不知道大家有没有测试给出的那些查询语句的结果。其中有一条是这样的。

> php vendor/hightman/xunsearch/util/Quest.php demo 项

小伙伴们测了没?是不是查不出东西呀!

跟你说,查不出来就对了,用 ES 也查不出来。如果你学过 ES ,那么在 Kibana 中使用下面的 ES 命令建立索引并插入数据来进行测试。(如果没学过的话就等视频哈,在视频里我也会演示)

PUT demo
{"mappings": {"properties": {"pid":{"type":"integer"},"subject":{"type":"text","analyzer": "ik_max_word"},"message":{"type":"text","analyzer": "ik_max_word"},"chrono":{"type":"integer"}}}
}POST demo/_doc
{"pid":1,"subject":"关于 xunsearch 的 DEMO 项目测试","message":"项目测试是一个很有意思的行为!","chrono":1314336158
}POST demo/_doc
{"pid":2,"subject":"测试第二篇","message":"这里是第二篇文章的内容","chrono":1314336160
}POST demo/_doc
{"pid":3,"subject":"项目测试第三篇","message":"俗话说,无三不成礼,所以就有了第三篇","chrono":1314336168
}

第一个 mappings 就是 ES 中的索引映射,就相当于表结构。我们针对  subject 和 message 使用了 IK 分词器来作为分词器。在 XS 中我们没有这个呀?不不不,有的,我们后面会看到,XS 自带的测试 demo 的结构就是和这个一样的。然后插入同样的三条数据。接下来进行查询测试。

GET demo/_search
{"query":{"query_string" : {"query" :"项目"}}
}GET demo/_search
{"query":{"query_string" : {"query" :"项"}}
}

不出意外的话,第一个查询和我们在 XS 中的查询结果是一样的,第二条则也同样查不到任何数据。

为什么呢?因为分词,重点说三遍,分词分词分词,索引索引索引。“项”按正常的分词器,不管是 IK 还是 SCWS ,都不会当成一个单词,也就不会为它建立倒排索引,这样就无法查询到。

而 like 语句的原理,是针对字段里的值逐一匹配,ES 中有类似的 wildcard 功能,但如果数据量非常大的情况下,使用 非前缀匹配的 wildcard 也会同样带来性能问题,因为它就和 MySQL 中使用 like 一样了,没法用到索引。XS 中没有类似的功能,XS 是完全的全文分词检索。

为啥要单独说这个?因为很多人,在迅搜的官网以及 Github 的 issue 中,都会不分青红皂白的上来就是说搜得不准,啥都搜不出来什么的。说实话,没有系统学习搜索引擎相关的知识前,我也不知道,我也以为它就是和 like 一样。为啥一个“项”字就搜不出来东西了?真是垃圾。

照这么说的话,ES 可能也得划到垃圾的范围中了。那么可以像类似于 like 一样去搜索吗?可以,但是不推荐,等到后面学习分词相关的知识时,我们会回来解决这个问题。

今天,我们先抛出问题,接下来的文章中咱们就一一学习全文检索、倒排索引、分词、文档、词频排序等等这一大堆的概念。

总结

今天的内容还好吧,比较概念,后面也还有一篇概念性的内容,主要就是倒排索引和分词的概念。完了之后才会开始正式的 XS 的应用学习,并在其中再穿插其它概念性的内容。没办法,我也想直接全部都在 XS 的学习过程中穿插概念性的内容,但是在搜索引擎中,索引和分词的概念确实是要提前说明的,就像上面的例子一样,否则大家就会一直在疑惑为啥总是搜索不到想要的东西。

不过反过来说,概念掌握了之后,其实不管是 XS 还是 ES ,或者其它任何搜索引擎工具,那都只是形式上的不同而已了。学习,在道、法、术三个层次中,最终要掌握的还是道,法是经验的积累,而术真的只是照着文档敲的事了。

另外做个小约定,从今天开始,全部使用 XunSearch 的简称 XS 了哦,有的地方可能我也会用中文名称 迅搜 ,但不再打完整的 XunSearch 这个词了哦。同样的,在需要对比的地方,我也会用 ES 来表示 ElasticSearch 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移远通信推出六款新型天线,为物联网客户带来更丰富的产品选择

近日,移远通信重磅推出六款新型天线,覆盖5G、非地面网络(NTN)等多种新技术,将为物联网终端等产品带来全新功能和更强大的连接性能。 移远通信COO张栋表示:“当前,物联网应用除了需要高性能的天线…

【libGDX】使用Mesh绘制三角形

1 Mesh 和 ShaderProgram 简介 1.1 创建 Mesh 1)Mesh 的构造方法 public Mesh(boolean isStatic, int maxVertices, int maxIndices, VertexAttribute... attributes) public Mesh(boolean isStatic, int maxVertices, int maxIndices, VertexAttributes attribut…

js ::after简单实战

::after的作用是在元素后面再加个XXX样式 工作中遇到了一个表格,鼠标指到单元格要有个整行编辑态的效果,下面写个简单的demo 有人可能会说了,直接修改某个单元格的hover样式不就行了嘛,问题是如果鼠标指到单元格和单元格直接的…

Android DatePicker(日期选择器)、TimePicker(时间选择器)、CalendarView(日历视图)- 简单应用

示意图&#xff1a; layout布局文件&#xff1a;xml <?xml version"1.0" encoding"utf-8"?> <ScrollView xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"…

实验过程中的问题记录

代码&#xff1a; if args.local_rank in [-1, 0] and eval_dataset is not None and args.eval_steps > 0 and global_step % args.eval_steps 0 :metric_cur eval_fn(args, eval_dataset, model, tokenizer, global_stepglobal_step, file_prefix"eval_")当参…

IP-guard Web系统远程命令执行漏洞说明

一、漏洞说明 近期收到反馈,IP-guard Web服务器存在远程命令执行漏洞(RCE),经过分析,确认是因为Web系统的申请审批功能使用了开源插件 flexpaper 实现文件在线预览功能,此插件存在远程代码执行漏洞。 攻击者可利用 flexpaper插件漏洞,在文件预览参数中拼接其它恶意命令…

时序预测 | Pytorch实现TCN-Transformer的时间序列预测

时序预测 | Pytorch实现TCN-Transformer的时间序列预测 目录 时序预测 | Pytorch实现TCN-Transformer的时间序列预测效果一览基本介绍程序设计 效果一览 基本介绍 基于TCN-Transformer模型的时间序列预测&#xff0c;可以用于做光伏发电功率预测&#xff0c;风速预测&#xff0…

管理体系标准

管理体系标准 什么是管理体系&#xff1f; 管理体系是组织管理其业务的相互关联部分以实现其目标的方式。这些目标可能涉及许多不同的主题&#xff0c;包括产品或服务质量、运营效率、环境绩效、工作场所的健康和安全等等。 系统的复杂程度取决于每个组织的具体情况。对于某…

Vue2+Vue3

文章目录 第 1 章&#xff1a;Vue 核心1、 Vue 简介1.官网2.介绍与描述3. Vue 的特点4. 与其它 JS 框架的关联5. Vue 周边库 2、初始Vue3、模板语法1、Vue模板语法有2大类:2、插值语法和指令语法 4、数据绑定1. 单向数据绑定2. 双向数据绑定 5、el与data的两种写法1.e1有2种写法…

社会媒体营销提问常用的ChatGPT通用提示词模板

如何制定有效的社会媒体营销策略&#xff1f; 如何选择适合的社会媒体平台进行营销&#xff1f; 如何创造有吸引力的社会媒体内容&#xff0c;提高用户参与度和分享率&#xff1f; 如何运用社交媒体广告来增加品牌曝光和用户转化&#xff1f; 如何建立和维护社交媒体账号和…

外部 prometheus监控k8s集群资源

prometheus监控k8s集群资源 一&#xff0c;通过CADvisior 监控pod的资源状态1.1 授权外边用户可以访问prometheus接口。1.2 获取token保存1.3 配置prometheus.yml 启动并查看状态1.4 Grafana 导入仪表盘 二&#xff0c;通过kube-state-metrics 监控k8s资源状态2.1 部署 kube-st…

【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷01

单选题 1、生活中&#xff0c;我们经常说“有机蔬菜”相比普通蔬菜更加健康&#xff0c;这是因为 A、它们没有使用无机肥料 B、它们是有机的 C、它们没有使用肥料 D、人们对蔬菜的错误认知 答案&#xff1a;A 2、甲乙两位工人一起在工厂工作。甲的生产速度是每小时6个鼠标…

网络运维与网络安全 学习笔记2023.11.21

网络运维与网络安全 学习笔记 第二十二天 今日目标 端口隔离原理与配置、路由原理和配置、配置多路由器静态路由 配置默认路由、VLAN间通信之路由器 端口隔离原理与配置 端口隔离概述 实现报文之间的2层隔离&#xff0c;除了使用VLAN技术以后&#xff0c;还可以使用端口隔…

c语言:十进制转任意进制

思路&#xff1a;如十进制转二进制 就是不断除二求余在除二求余&#xff0c;然后将余数从下到写出来&#xff0c;这样&#xff0c;10011100就是156的二进制 这里举例一个六进制的代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h>int main() {int …

opencv-简单图像处理

图像像素存储形式  对于只有黑白颜色的灰度图&#xff0c;为单通道&#xff0c;一个像素块对应矩阵中一个数字&#xff0c;数值为0到255, 其中0表示最暗&#xff08;黑色&#xff09; &#xff0c;255表示最亮&#xff08;白色&#xff09; 对于采用RGB模式的彩色图片&#…

「MACOS限定」 如何将文件上传到GitHub仓库

介绍 本期讲解&#xff1a;如何在苹果电脑上上传文件到github远程仓库 注&#xff1a;写的很详细 方便我的朋友可以看懂操作步骤 第一步 在电脑上创建一个新目录&#xff08;文件夹&#xff09; 注&#xff1a;创建GitHub账号、新建github仓库、git下载的步骤这里就不过多赘…

118.184.158.111德迅云安全浅谈如何避免网络钓鱼攻击

随着互联网的不断发展&#xff0c;网络钓鱼攻击也越来越猖獗&#xff0c;给个人和企业带来了巨大的经济损失和安全威胁。本文对如何防范网络钓鱼攻击提出的一些小建议 希望对大家有所帮助。 1.防止XSS&#xff08;跨站脚本攻击&#xff09;攻击 XSS攻击指的是攻击者在网站中注入…

html手势密码解锁插件(附源码)

文章目录 1.设计来源1.1 界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134534785 html手势密码解锁插件(附源码)&#xff0c;仿手机手势密码&#xff0c;拖动九…

基于SSM的网络财务管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

github连接失败Host key verification failed.解决方案

问题描述 之前一直用的gitee协同协作&#xff0c;然后再最近一次云计算项目中团队使用的是github进行协作&#xff0c;但是按照常规步骤再GitHub上配置了ssh密钥后&#xff0c;却依然显示连接失败&#xff0c;无法推送和拉取代码&#xff0c;克隆仓库也是报错拒绝。具体报错信…