【迅搜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 ,其它的就不太清楚了。因此,我就主要对比这四个,大部分资料也是网上找到的。
| XunSearch | ElasticSearch | Solr | Sphinx | |
|---|---|---|---|---|
| 引擎 | Xapian | Lucene | Lucene | 不知道 |
| 引擎开发语言 | C/C++ | Java | Java | C/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等配合紧密 |
| 中文支持 | 自带SCWS | IK、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 。
相关文章:
【迅搜02】究竟什么是搜索引擎?正式介绍XunSearch
究竟什么是搜索引擎?正式介绍XunSearch 啥?还要单独讲一下啥是搜索引擎?不就是百度、Google嘛,这玩意天天用,还轮的到你来说? 额,好吧,虽然大家天天都在用,但是我发现&am…...
【Sql】sql server还原数据库的时候,提示:因为数据库正在使用,所以无法获得对数据库的独占访问权。
【问题描述】 sql server 还数据库的时候,提示失败。 点击左下角进度位置,可以得到详细信息: 因为数据库正在使用,所以无法获得对数据库的独占访问权。 【解决方法】 针对数据库先后执行下述语句,获得独占访问权后&a…...
【Go语言实战】(26) 分布式搜索引擎
Tangseng 基于Go语言的搜索引擎 github地址:https://github.com/CocaineCong/tangseng 详细介绍地址:https://cocainecong.github.io/tangseng 这两周我也抽空录成视频发到B站的~ 本来应该10月份就要发了,结果一鸽就鸽到现在hh…...
【理解ARM架构】不同方式点灯 | ARM架构简介 | 常见汇编指令 | C与汇编
🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀直接操作寄存器点亮LED灯🏀地址空间🏀ARM内部的寄存…...
JS服务端技术—Node.js知识点锦集
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/134544523 出自【进步*于辰的博客】 接触Node.js挺长时间了,工作也经常使用…...
界面控件DevExpress WPF流程图组件,完美复制Visio UI!(一)
DevExpress WPF Diagram(流程图)控件帮助用户完美复制Microsoft Visio UI,并将信息丰富且组织良好的图表、流程图和组织图轻松合并到您的下一个WPF项目中。 P.S:DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至…...
为什么选择B+树作为数据库索引结构?
背景 首先,来谈谈B树。为什么要使用B树?我们需要明白以下两个事实: 【事实1】 不同容量的存储器,访问速度差异悬殊。以磁盘和内存为例,访问磁盘的时间大概是ms级的,访问内存的时间大概是ns级的。有个形象…...
什么是神经网络(Neural Network,NN)
1 定义 神经网络是一种模拟人类大脑工作方式的计算模型,它是深度学习和机器学习领域的基础。神经网络由大量的节点(或称为“神经元”)组成,这些节点在网络中相互连接,可以处理复杂的数据输入,执行各种任务…...
15 Go的并发
概述 在上一节的内容中,我们介绍了Go的类型转换,包括:断言类型转换、显式类型转换、隐式类型转换、strconv包等。在本节中,我们将介绍Go的并发。Go语言以其强大的并发模型而闻名,其并发特性主要通过以下几个元素来实现…...
管理体系标准
管理体系标准 什么是管理体系? 管理体系是组织管理其业务的相互关联部分以实现其目标的方式。这些目标可能涉及许多不同的主题,包括产品或服务质量、运营效率、环境绩效、工作场所的健康和安全等等。 系统的复杂程度取决于每个组织的具体情况。对于某…...
【Java 进阶篇】揭秘 Jackson:Java 对象转 JSON 注解的魔法
嗨,亲爱的同学们!欢迎来到这篇关于 Jackson JSON 解析器中 Java 对象转 JSON 注解的详细解析指南。JSON(JavaScript Object Notation)是一种常用于数据交换的轻量级数据格式,而 Jackson 作为一款优秀的 JSON 解析库&am…...
②【Hash】Redis常用数据类型:Hash [使用手册]
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Redis Hash ②Redis Hash 操作命令汇总1. hset…...
十七、SpringAMQP
目录 一、SpringAMQP的介绍: 二、利用SpringAMQP实现HelloWorld中的基础消息队列功能 1、因为publisher和consumer服务都需要amqp依赖,因此这里把依赖直接放到父工程mq-demo中 2、编写yml文件 3、编写测试类,并进行测试 三、在consumer…...
Java虚拟机(JVM)的调优技巧和实战
JVM是Java应用程序的运行环境,它负责管理Java应用程序的内存分配、垃圾收集等重要任务。然而,JVM的默认设置并不总是适合所有应用程序,因此需要根据应用程序的需求进行调优。通过对JVM进行调优,可以大大提高Java应用程序的性能和可…...
idea中的sout、psvm快捷键输入,不要太好用了
目录 一、操作环境 二、psvm、sout 操作介绍 2.1 psvm,快捷生成main方法 2.2 sout,快捷生成打印方法 三、探索 psvm、sout 底层逻辑 一、操作环境 语言:Java 工具: 二、psvm、sout 操作介绍 2.1 psvm,快捷生成m…...
shell脚本字典创建遍历打印
解释: 代码块中包含了每个用法的详细解释 #!/bin/bash# 接收用户输入的两个数 echo "请输入第一个数:" read num1 echo "请输入第二个数:" read num2# 创建一个关联数组 declare -A dict1 declare -A dict2# 定义键和值…...
【设计模式】聊聊职责链模式
原理和实现 模板模式变化的是其中一个步骤,而责任链模式变化的是整个流程。 将请求的发送和接收解耦合,让多个接收对象有机会可以处理这个请求,形成一个链条。不同的处理器负责自己不同的职责。 定义接口 public interface Filter {/*** …...
【C++进阶之路】第五篇:哈希
文章目录 一、unordered系列关联式容器1.unordered_map(1)unordered_map的介绍(2)unordered_map的接口说明 2. unordered_set3.性能对比 二、底层结构1.哈希概念2.哈希冲突3.哈希函数4.哈希冲突解决(1)闭散…...
CentOS基Docker容器时区配置解决方案
配置Docker容器的时区对于确保应用程序正确处理日期和时间至关重要。当使用CentOS作为基础镜像时,可以通过以下两种方法配置时区: 方法一:在Dockerfile中设置时区 这种方法涉及在构建Docker镜像的过程中设置时区。 步骤 选择基础镜像&…...
探索 Material 3:全新设计系统和组件库的介绍
探索 Material 3:全新设计系统和组件库的介绍 一、Material 3 简介1.1 Material 3 的改进和更新1.2 Material 3 的优势特点 二、Material 3 主题使用2.1 使用 Material3 主题2.2 使用 Material3 主题颜色 三、Material 3 组件使用3.1 MaterialButton:支持…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
