【迅搜01】安装运行并测试XunSearch
安装运行并测试XunSearch
这回的新系列,我们将学习到的是一个搜索引擎 迅搜 XunSearch 的使用。这个搜索引擎在 PHP 圈可能还是有一点名气的,而且也是一直在更新的,虽说现在 ElasticSearch 已经是实际上的搜索引擎霸主了,而且还有 Solr 在后的不断追赶,但要说最简单、最实在,而且最容易让我们这些 PHPer 上手的,绝对还是 XunSearch 。
在我的学习过程中,发现很多人其实对搜索引擎工具的认识不足,而且也会有很多同学在吐槽 XunSearch 官方文档不好。这些呀,其实根本都还是在于概念定位的不清晰。因此,除了基本的 XunSearch 的学习,我们还会顺便略讲一点点搜索引擎的相关知识,也会顺道地看一看组成 XunSearch 的核心组件 SCWS 和 Xapian 。
讲 XunSearch 的文章不少,视频也有一点,但可能像我们这个系列一样详细学习的不多。有一说一,这一系列可能真的是全网唯一了。
安装
XunSearch 的安装相对来说还是比较简单的,普通测试的本地安装,可以使用 Docker 的方式,后面再说,先说一下官网文档中的在 Linux 下面的安装。
Linux 安装
没啥别的,上来就是先装一堆需要的环境软件。如果是 CentOS 系列的话,直接 yum 安装就好了。我这里使用的是 CentOS8 。
> yum install -y bzip2 gcc wget automake autoconf libtool make kernel-headers kernel-devel zlib-devel gcc-c++ libevent libevent-devel
安装完需要依赖的环境软件之后,就可以按照官网的步骤来进行安装了。下载最新的版本,解压,执行 setup.sh
就行了,简单到没朋友。
> wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2
> tar -xjf xunsearch-full-latest.tar.bz2
> cd xunsearch-full-1.4.17/
> sh setup.sh
+==========================================+
| Welcome to setup xunsearch(full) |
| 欢迎使用 xunsearch (完整版) 安装程序 |
+------------------------------------------+
| Follow the on-screen instructions please |
| 请按照屏幕上的提示操作以完成安装 |
+==========================================+Please specify the installation directory
请指定安装目录 (默认为中括号内的值)
[/usr/local/xunsearch]:Confirm the installation directory
请确认安装目录:/usr/local/xunsearch [Y/n]y
………………………………
> /usr/local/xunsearch/bin/xs-ctl.sh restart
中间需要关注的是,在执行 sh setup.sh
之后,需要确认安装目录,这个目录可以使用默认的,也可以自己定义一个,一般我们选择默认的就好了。安装后的所有内容就在 /usr/local/xunsearch
这个目录下面。
最后就是使用安装目录下面的 bin
目录下面的 xs-ctl.sh
运行起整个 XunSearch 环境。如果没有任何报错信息,就可以通过 netstat -ntlp
查看软件的端口占用,XunSearch 使用的是 8383 和 8384 这两个端口。
这个时候,你会发现端口是和 127.0.0.1 绑定的,就像之前学习过的 Redis 中的内容一样,这样绑定的端口外部是无法访问的。因此,如果需要外部能够访问到这台 Linux 上的这两个端口,就需要添加一个启动参数。
> /usr/local/xunsearch/bin/xs-ctl.sh stop
> /usr/local/xunsearch/bin/xs-ctl.sh -b inet start
我们可以通过 stop
停止服务,然后再使用 -b inet
参数重新启动 XunSearch ,现在再次通过 netstat -ntlp
就可以看到端口绑定已经是 0.0.0.0 了。
在这些年的使用和学习过程中,整个安装过程,我基本没有踫到过什么问题。但一些同事在安装过程中遇到过系统 openssl 版本高的问题,比如下面这样的报错信息。
这种报错就需要要替换一下 XunSearch 中的 libevent ,主要就是操作系统的软件版本高了,而 XunSearch 自带的这个 libevent 版本低了,需要按下面的步骤换一个。
// 下载新版本的
> wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
//先将libevent解压(以便压缩成所需格式)
> tar -zxvf libevent-2.1.12-stable.tar.gz
//压缩成bz2格式,这是迅搜安装包的支持的格式
> tar -cjf libevent-2.1.12-stable.tar.bz2 libevent-2.1.12-stable
//复制到xunsearch下的packages文件夹内
> cp libevent-2.1.12-stable.tar.bz2 xunsearch-full-1.4.17/packages/
//进入安装包的目录并将原来自带的libevent安装包删除(xunsearch1.4.17自带的是2.0.X)
> cd xunsearch-full-1.4.15/packages/
> rm -f libevent-2.0.X
//返回上一步的文件夹(即迅搜安装包的根目录),然后执行setup.sh就可以了,
//迅搜会自动检查安装包文件内的libevent开头的安装包,如果没找到会报错,如果找到了就会自动解压并编译安装
> cd ..
> ./setup.sh
Docker 安装
上面是 Linux 下面的安装,之前我如果要使用学习 XunSearch 的话也需要在本地搭虚拟机环境,不过现在就方便多啦,直接用 Docker 就可以非常快速地在本地搭建起一套学习环境,而且 Win 和 Mac 都适用哦。
docker run --name xunsearch -d -p 8383:8383 -p 8384:8384 -v /Users/zhangyue/XunSearch/data:/usr/local/xunsearch/data hightman/xunsearch:latest
这个就不多解释了,端口原样映射,然后把数据目录挂载出来就可以了。注意,还有一个 etc 目录,后面我们学习自定义词典时,如果你想通过 docker 来操作自定义词典,就需要将 etc 目录挂载出来,不过需要提前先准备一个不挂载的容器实例并将其中的 /usr/local/xunsearch/etc 目录导出来,然后复制到挂载目录。因为 docker 会用宿主机挂载目录替换容器内部目录,如果直接挂载,就会导致没有可用词典的情况。
具体内容可以查阅 Docker 相关学习资料。
官方测试脚本
好了,上面的安装步骤完成之后,我们就要来进行测试了。XunSearch 不像 ElasticSearch 一样,自带 RESTFul 接口,直接安装完成就可以像用命令行直接进行测试。XunSearch 是需要使用客户端的,即使是底层的 Xapian ,在其官网文档上,也是直接使用 Python 客户端来进行测试的。这个 Xapian 是个啥玩意,我们后面再细说,反正现在大家就是要知道,我们现在就必须使用 XunSearch 提供的 PHP 的 SDK 包来进行连接和测试了,这个就相当于是一个客户端。
在我们存放测试代码的目录中,直接使用 Composer 安装 XunSearch 的官方扩展包就行。
# xxxxxxxx/MyDoc/博客文章/dev-blog/xunsearch/source
composer require hightman/xunsearch
使用 Composer 安装完成之后,就会在当前目录生成 vendor 包,SDK 文件也会在这里面。在 XunSearch 的官方 SDK 包中,直接就有一堆现成的工具可以使用,这些内容也在官方文档上有说明。咱们今天还是先简单的看看。首先,就是导入测试数据。
➜ source git:(master) ✗ php vendor/hightman/xunsearch/util/Indexer.php --source=csv --clean demo
清空现有索引数据 ...
初始化数据源 ... csv
WARNING: input file not specified, read data from <STDIN>
开始批量导入数据 (请直接输入数据) ...
是的,直接命令行模式运行 vendor/hightman/xunsearch/util/Indexer.php
这个文件,这个文件就是官方提供的工具包中的索引操作文件。后面的参数表示的是 --source
数据来源,这里我们是使用的 csv ,然后直接手动输入。其实它还可以指定一个文件直接导入整个文件的,另外这个数据源选项也可以指定为 MySQL 等其它各种数据来源。这些我们都放到后面再细说。
接下来的是 --clean
,表示清空索引。后面的 demo
,表示使用 demo
这个索引文件。这些都是什么鬼?别急,先照着来,在后面的学习中我们会一一学习,今天的任务是首先要安装好,能够跑起来,并能够进行简单地测试。
好了,光标停在这里不动了,我们现在可以复制官网的例子语句来输入。
1,关于 xunsearch 的 DEMO 项目测试,项目测试是一个很有意思的行为!,1314336158
回车之后没啥反应,好吧,先继续输入后面两条。
2,测试第二篇,这里是第二篇文章的内容,1314336160
3,项目测试第三篇,俗话说,无三不成礼,所以就有了第三篇,1314336168
输入完成之后,使用 Ctrl+D
快捷键结束输入,注意,这个快捷键是输入结束的意思,也可以用来取代 exit 的输入。而我们常用的 Ctrl+C
是中断程序的意思,这里不要用错了哦。Windows 的命令行需要使用 Ctrl+z
。
INFO: reach end of file or error occured, total lines: 3
完成索引导入:成功 3 条,失败 0 条
刷新索引提交 ...
这下有反应了吧,显示成功了 3 条。紧接着,我们再用官方提供的工具来进行查询。上面的步骤就像是我们将那三行数据 Insert 进了数据库,而接下来我们就要 Select 一下。这回我们使用 vendor/hightman/xunsearch/util/Quest.php
这个工具。
➜ source git:(master) ✗ php vendor/hightman/xunsearch/util/Quest.php demo 项目
在 3 条数据中,大约有 2 条包含 项目 ,第 1-2 条,用时:0.0273 秒。1. 关于 xunsearch 的 DEMO 项目测试 #1# [100%,0.44]
项目测试是一个很有意思的行为!
Chrono:1314336158 2. 项目测试第三篇 #3# [99%,0.44]
俗话说,无三不成礼,所以就有了第三篇
Chrono:1314336168
后面的参数,第一个 demo
表示查询 demo
索引下面的内容,第二个 项目
就是我们的查询关键字,就像是你在百度的搜索框中输入的文字一样。
结果是不是我们想要的内容呢?现在你可以继续再测试别的关键字。比如:
php vendor/hightman/xunsearch/util/Quest.php demo 测试
php vendor/hightman/xunsearch/util/Quest.php demo 项目测试
php vendor/hightman/xunsearch/util/Quest.php demo 俗话说
php vendor/hightman/xunsearch/util/Quest.php demo 莫须有
php vendor/hightman/xunsearch/util/Quest.php demo 项
注意最后一个搜索的关键字,有没有发现什么问题呢?这个咱们后面会细说哦,很多人在没有系统的学习搜索引擎相关知识前,会对这里产生很大的疑惑。官网文档的评论,还有 XunSearch 的 Github 的 issue 中,很多人都会出现这个问题进而否认 XunSearch 的能力,其实,可能真的只是大家误会了。扯远了,还是先以今天的任务为主,后面咱们会好好说这个问题。
PHP 中查询
官网的 SDK 可不止是上面的那些工具呀,它本身就是一个 Composer 包,本身就是给我们的项目所使用的扩展包。因此,其实更多情况下,我们在业务代码,也就是普通 PHP 中进行开发才是这个扩展包最重要的作用。那么在 PHP 中,我们要如何使用呢?
// 1.php
require_once 'vendor/autoload.php';$xs = new XS('demo'); $doc = $xs->search->search("项目");print_r($doc);
额,就这么四行,效果和上面的查询工具的效果是一样的。简单的我都不想解释了,不过本着完整详尽的原则,咱们还是来说一说吧。
先是 require_once ,这个不用多解释了吧,Composer 基础知识,不记得的小伙看我最早最早的 Composer 小系列,公众号或者博客上搜一下就好了。
然后就是实例化一个 XS 对象,这个对象可以看做是 XunSearch 的一个实例,它的构造参数需要一个索引名称,这里我们还是使用那个 demo
索引。
接下来,通过 XS 对象的 search 属性,返回一个 XSSearch 对象,然后再通过这个对象的 search() 方法,来实现查询。这里我就直接是链式调用,一行写完了。注意,别看到两个 search 就发懵了,第一个是一个 search 属性,返回的是另一个对象哦。
接下来测试一下吧!
➜ source git:(master) ✗ php 1.php
Array
([0] => XSDocument Object([_data:XSDocument:private] => Array([pid] => 1[subject] => 关于 xunsearch 的 DEMO 项目测试[chrono] => 1314336158[message] => 项目测试是一个很有意思的行为!)[_terms:XSDocument:private] => [_texts:XSDocument:private] => [_charset:XSDocument:private] => UTF-8[_meta:XSDocument:private] => Array([docid] => 1[rank] => 1[ccount] => 0[percent] => 100[weight] => 0.43975225090981))[1] => XSDocument Object([_data:XSDocument:private] => Array([pid] => 3[subject] => 项目测试第三篇[chrono] => 1314336168[message] => 俗话说,无三不成礼,所以就有了第三篇)[_terms:XSDocument:private] => [_texts:XSDocument:private] => [_charset:XSDocument:private] => UTF-8[_meta:XSDocument:private] => Array([docid] => 3[rank] => 2[ccount] => 0[percent] => 99[weight] => 0.43939647078514)))
输出的结果是 XSDocument 对象形成的数组,在对象中,我们看到了搜索结果的属性内容。
到此为止,整个安装、测试过程就完成了。咱们的第一课就这样愉快的结束咯。
总结
好吧,好吧,相信你和我一样,还有着不少的疑问。如果你没有学习过 ElasticSearh ,也没有接触过任何搜索引擎相关的知识,那么你一定会发出这样的感慨:搞了半天搞了个啥呀这是。因为这也是我当初的感慨。别急,B 站里任意一个 ElasticSearch 相关的视频,至少都会讲6、7个小时,咱这刚开始,一步一步来,别急嘛。先完成第一步,搭起环境,测试连通,都没问题之后,我们下篇文章就开始讲最重要的原理了,到底啥是搜索引擎,并且正式介绍一下 XunSearch 到底是个啥!
测试代码:
https://github.com/zhangyue0503/dev-blog/tree/master/xunsearch
参考文档:
http://www.xunsearch.com/doc/php/guide/start.installation
http://www.xunsearch.com/doc/php/guide/start.demo
相关文章:

【迅搜01】安装运行并测试XunSearch
安装运行并测试XunSearch 这回的新系列,我们将学习到的是一个搜索引擎 迅搜 XunSearch 的使用。这个搜索引擎在 PHP 圈可能还是有一点名气的,而且也是一直在更新的,虽说现在 ElasticSearch 已经是实际上的搜索引擎霸主了,而且还有…...

Mac电脑VSCode配置PHP开发环境
1.安装 PHP 首先,打开终端,安装 Homebrew,输入如下命令: $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装了 Homebrew 之后,你可以使用下面的…...

SpirngBoot + Vue 前后端分离开发工具代码
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏…...

【数据结构初阶】单链表(附全部码源)
单链表 1,单链表的概念及结构2,单链表的实现2.1初始化内容(所需文件,接口)2.2申请结点2.3打印单链表2.4尾插2.5头插2.6尾删2.7头删2.8查找2.9在pos位置之后插入2.10在pos位置前面插入2.11删除pos之后的值2.12删除pos位…...

数据治理入门
处理模式 模式名称常见场景常见框架批处理夜间几个小时,无人值守hive spark datax流处理7*24H一直运行,无人值守maxwell, flink, flume, kafka即席处理人机交互接口访问 web页面 数据治理的意义 数据质量低:数据错误,不准确或不…...

uniapp 微信小程序登录 新手专用 引入即可
预览 第一步导入插件 在引入的页面的登录按钮下拷贝一下代码 <template><view class"content"><button type"primary" click"login">微信登录</button></view><TC-WXlogin :wxloginwxlogin /> </templ…...

PMCW体制雷达系列文章(4) – PMCW雷达之抗干扰
说明 本文作为PMCW体制雷达系列文章之一,主要聊聊FMCW&PMCW两种体制雷达的干扰问题。事实上不管是通信领域还是雷达领域,对于一切以电磁波作为媒介的信息传递活动,干扰是无处不在的。近年来,随着雷达装车率的提高,…...

Gin框架源码解析
概要 目录 Gin路由详解 Gin框架路由之Radix Tree 一、路由树节点 二、请求方法树 三、路由注册以及匹配 中间件含义 Gin框架中的中间件 主要讲述Gin框架路由和中间件的详细解释。本文章将从Radix树(基数树或者压缩前缀树)、请求处理、路由方法树…...

MacOS设置JAVA_HOME环境变量
首先先查看一下,系统当前使用的java是谁,可以使用/usr/libexec/java_home命令 % /usr/libexec/java_home /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home检查一下这个路径下的文件,发现这是一个jre的目录。加上-V参数看…...
闭眼检测实现
引言 这段代码是一个实时眼睛状态监测程序,可以用于监测摄像头捕获的人脸图像中的眼睛状态,判断眼睛是否闭合。具体应用实现作用说明如下: 1. 实时监测眼睛状态 通过摄像头捕获的实时视频流,检测人脸关键点并计算眼睛的 EAR&a…...

系列六、Java垃圾回收器主要有哪些?
一、Java垃圾回收器主要有哪些? UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParallelNewGC、UseParallelOldGC、UseG1GC...

【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis
目录 【7】Spring Boot 3 集成组件:缓存组件 spring cache spring data redis什么是缓存抽象声明式注解JSR-107对应SpEL上下文数据 引入依赖cache 支持的缓存类型缓存类型配置NONESIMPLEREDIS自定义配置 CAFFEINE Hazelcast...总结 个人主页: 【⭐️个人主页】 需要…...

说说Java中的不可重入锁
什么是锁? 简单来讲在Java中,锁是一种用于并发控制的机制,用于保护共享资源,防止多个线程同时访问或修改数据导致的数据不一致性和线程安全问题。在Java虚拟机(JVM)中,每个对象都有一个相关联的…...

C++学习 --vector
目录 1, 什么是vector 2, 创建vector 2-1, 标准数据类型 2-2, 自定义数据类型 2-3, 其他创建方式 3, 操作vector 3-1, 赋值 3-2, 添加元素 3-2-1, 添加元素(assi…...
Android图片涂鸦,Kotlin(1)
Android图片涂鸦,Kotlin(1) import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.graphics.PointF import android.…...

upload-labs(1-17关攻略详解)
upload-labs pass-1 上传一个php文件,发现不行 但是这回显是个前端显示,直接禁用js然后上传 f12禁用 再次上传,成功 右键打开该图像 即为位置,使用蚁剑连接 连接成功 pass-2 源码 $is_upload false; $msg null; if (isse…...

《 机器人基础 》期末试卷(A)
一、填空题(30分,每空2分) 1. 按照相机的工作方式,机器人常用相机分为1)__ 单目摄像头 2)__ 双目摄像头 _ 3)_深度摄像头_ 三类。 2. 度量地图强调…...

Azure Machine Learning - Azure AI 搜索中的矢量搜索
矢量搜索是一种信息检索方法,它使用内容的数字表示形式来执行搜索方案。 由于内容是数字而不是纯文本,因此搜索引擎会匹配与查询最相似的矢量,而不需要匹配确切的字词。本文简要介绍了 Azure AI 搜索中的矢量支持。 其中还解释了与其他 Azure…...

3 redis实现一个消息中间件
使用list实现一个队列,可以从左侧入队,也可以从右侧入对 即可以从左侧读取,也可以从右侧读取 1、Lindex Lindex 命令用于通过索引获取列表中的元素 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的…...

js添加dom到指定div之后,并给添加的dom类名,然后设置其样式,以及el-popover层级z-index过高问题解决。
遇到一个需求,Vue项目做一个表格,要求表头与表格内容分开,如下效果所示,表头与表格有个高度间隔边距(箭头所示),因为默认我们的el-table的表头与内容是一起的: 思路:通过querySelector获取el-table__header-wrapper元素,通过createElement创建一个div,通过 newElem…...

C语言结构体
#include <stdio.h> #include <string.h> #include <stdlib.h>//struct Student_s { // int num; // char name[20]; // char gender; // int age; // float Chinese; // float Math; // float English; // char addr[30]; //}; //最后的分号一定要写&#x…...

【Python大数据笔记_day10_Hive调优及Hadoop进阶】
hive调优 hive官方配置url: Configuration Properties - Apache Hive - Apache Software Foundation hive命令和参数配置 hive参数配置的意义: 开发Hive应用/调优时,不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率,或帮助定位问…...

React经典初级错误
文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者,我们创造bug,传播bug,毫不留情地消灭bug,在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案,感兴…...

C# System.Array.CopyTo() 和 System.Array.Clone() 有什么区别
System.Array.CopyTo() 和 System.Array.Clone() 是用于数组复制的两种不同方法,它们在实现和用途上有一些区别。 System.Array.CopyTo() 方法: CopyTo() 方法用于将数组的元素复制到另一个数组。它是 Array 类的实例方法,可以用于复制一个…...

Stable Diffusion 启动时 got an unexpected keyword argument ‘socket_options‘ 错误解决
Stable Diffusion 启动时 got an unexpected keyword argument socket_options 错误解决 问题解决方法 问题 Launching Web UI with arguments: Traceback (most recent call last):File "launch.py", line 48, in <module>main()File "launch.py"…...

CSS 文本属性篇
文字颜色 属性名:color作用:控制文字的颜色可选值: 1.颜色名 color: blue; 2.rgb或rgba color:rgb(132, 220, 254); color:rgba(132, 220, 254,0.5); 3.hex或hexa(十六进制) color:#0078d4; color:#0078d48b; 4.hsl或h…...
Activiti,Apache camel,Netflex conductor对比,业务选型
Activiti,Apache camel,Netflex conductor对比,业务选型 1.activiti是审批流,主要应用于人->系统交互,典型应用场景:请假,离职等审批 详情可见【精选】activti实际使用_activiti通过事件监听器实现的优势_记录点滴…...

pythom导出mysql指定binlog文件
要求 要求本地有py环境和全局环境变量 先测试直接执行binlog命令执行命令 Windows 本地直接执行命令 # E:\output>E:\phpstudy_pro\Extensions\MySQL5.7.26\bin\mysqlbinlog binglog文件地址 # --no-defaults 不限制编码 # -h mysql链接地址 # -u mysql 链接名称 # -p m…...

TDengine 跨版本迁移实战
TDengine 3.0 已经退出了近一年,目前已经到了 3.2 版本。很遗憾的是 2.x 和 3.x 之间的数据文件不兼容。 如果向从 2.x 升级到 3.x 只能选择数据迁移的方式。 目前数据迁移有三种方法: 使用官方推荐工具 taosx。使用 taosdump 工具。自己写程序。 迁移…...

FPGA设计时序约束八、others类约束之Set_Case_Analysis
目录 一、序言 二、Set Case Analysis 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中,存在一类特殊的约束,划分在others目录下,可用于设置忽略或修改默认的时序…...