【迅搜01】安装运行并测试XunSearch

news2024/11/27 7:33:45

安装运行并测试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 版本高的问题,比如下面这样的报错信息。

92d7bd7aef0d34983e29f0ac008b2500.jpeg

这种报错就需要要替换一下 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

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

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

相关文章

容性负载箱与电容器的关系是什么?

容性负载箱用于测试电容器性能的设备&#xff0c;电容器是储存电能的元件&#xff0c;具有储存和释放电荷的能力。容性负载箱通过对电容器施加不同的负载&#xff0c;可以测量电容器的容量、电压响应、损耗等参数。 容性负载箱与电容器的关系主要体现在以下几个方面&#xff1a…

快递鸟荣获全球电子商务创业创新大赛总决赛一等奖

日前&#xff0c;以“开放、连接、协同、赋能”为主题&#xff0c;由商务部中国国际电子商务中心指导&#xff0c;浙江省商务厅、中共省委组织部、中共省委宣传部、中共省委网信办、省发展和改革委、省教育厅、省科技厅、省财政厅、省人力社保厅、团省委主办&#xff0c;湖州市…

聊聊ThreadLocal(二)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 大部分面试官喜欢问Thr…

idea一键打包docker镜像并推送远程harbor仓库的方法(包含spotify和fabric8两种方法)--全网唯一正确,秒杀99%水文

我看了很多关于idea一键打包docker镜像并推送harbor仓库的文章&#xff0c;不论国内国外的&#xff0c;基本上99%都是瞎写的&#xff0c; 这些人不清楚打包插件原理&#xff0c;然后就是复制粘贴一大篇&#xff0c;写了一堆垃圾&#xff0c;然后别人拿来也不能用。 然后这篇文…

使用html2canvas转换table为图片时合并单元格rowspan失效,无边框显示问题解决(React实现)

最近使用 html2canvas导出Table表单为图片&#xff0c;但是转换出的图片被合并的单元格没有显示边框 查了原因是因为我为tr设置了背景色&#xff0c;然后td设置了rowspan&#xff0c;设置了rowspan的单元格就会出现边框不显示的问题。 解决方法就是取消tr的背景色&#xff0c;然…

小米手环8pro重新和手机配对解决办法

如果更换了手机&#xff0c;那么小米手环8pro是无法和新手机自动连接的。 但是在新手机上直接连接又连接不上&#xff0c;搜索蓝牙根本找不到手环的蓝牙。 解决办法就是&#xff1a; 把手环恢复出厂&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 是的&…

Ubuntu 20.04 调整交换分区大小

Ubuntu 调整交换分区大小 一、系统情况二、去除旧的交换分区文件三、配置并启用交换分区四、查看swap文件大小 一、系统情况 Ubuntu &#xff1a;Ubuntu 20.04.6 LTS 交换分区位置&#xff1a; cat /proc/swaps二、去除旧的交换分区文件 去掉旧的交换分区有两个步骤&#x…

为什么嵌入式没有35岁危机?

为什么嵌入式没有35岁危机? 在当今数字化时代&#xff0c;IT行业变化迅速&#xff0c;技术的更新迭代速度惊人。然而&#xff0c;有一个技术领域却能够在这个竞争激烈的行业中稳步前行&#xff0c;而且不受35岁危机所困扰&#xff0c;那就是嵌入式技术。 嵌入式技术是指将计算…

Android开发:(AndroidStudio模拟器)如何将模拟器语言设置为中文 模拟器输入法更改为中文输入 键盘输入中文

文章目录 Android开发模拟器设置将模拟器语言设置为中文输入法中文的设置 Android开发模拟器设置 将模拟器语言设置为中文 第一步&#xff1a;打开模拟器后&#xff0c;上滑打开下面的设置图标。 第二步&#xff1a;找到 System (系统) &#xff0c;点击进入。 第三步&am…

外贸自建站怎么做?做外贸要怎样建设网站?

外贸自建站如何建立&#xff1f;海洋建站的具体步骤有哪些&#xff1f; 通过建立自己的外贸网站&#xff0c;您可以更好地展示公司的产品和服务&#xff0c;吸引更多的潜在客户&#xff0c;提高品牌知名度&#xff0c;拓展海外市场。那么&#xff0c;如何建立一个成功的外贸自…

千兆光模块和万兆光模块需要注意哪些事项

随着网络通信技术的发展&#xff0c;千兆光模块和万兆光模块已经成为了网络设备中不可或缺的关键组件。光模块的制造涉及到许多技术和工艺问题&#xff0c;需要严格的控制和管理。本文将从工艺流程、材料选用、测试认证等方面&#xff0c;详细介绍制造千兆光模块和万兆光模块需…

React实战演练项⽬一需求分析及vite_react搭建项目

React实战演练项⽬一需求分析及项目初始化 需求分析 刚学完React,开始找项目进行上手练习&#xff01; 页面组件拆分&#xff1a; 头部&#xff1a;导航tab、搜索框、登录注册 中间&#xff1a;分类导航、轮播图、新人福利、高单价产品导航 课程分类列表、底部内容、登陆提…

android 数独小游戏 经典数独·休闲益智

一款经典数独训练app 标题资源下载 &#xff08;0积分&#xff09;https://download.csdn.net/download/qq_38355313/88544810 首页页面&#xff1a; 1.包含有简单、普通、困难、大师四种难度的数独挑战供选择&#xff1b; 记录页面&#xff1a; 1.记录用户训练过的数独信息&…

使用requests库设置no_proxy选项的方法

问题背景 在使用requests库进行HTTP请求时&#xff0c;如果需要使用爬虫IP服务器&#xff0c;可以通过设置proxies参数来实现。proxies参数是一个字典&#xff0c;其中包含了爬虫IP服务器的地址和端口号。然而&#xff0c;当前的requests库并不支持通过proxies参数来设置no_pr…

map和set的简易封装(纯代码)

RBTree.h #pragma once#include<iostream> #include<vector> using namespace std;enum colar { red,black };template<class T>//有效参数就一个 struct RBTreeNode {RBTreeNode(const T& data):_left(nullptr), _right(nullptr), _parent(nullptr)…

这么好看的马面裙 ,女儿穿上不要太美了

红色小翻领&#xff0c;上身米白色金貂绒面料精细顺滑非常有质感 另外还有全手工定制的盘口裙子用的是仿宋代宋锦的织金面料 制作工艺非常复杂很重工的一件衣服 出门保证会被夸&#xff01;&#xff01;

用Python制作截图小工具

Python编程语言允许我们执行各种任务&#xff0c;所有这些都是在简单模块和短小精悍的代码的帮助下完成的。在Python的帮助下进行屏幕截图就是这样一项任务。 Python为我们提供了许多模块&#xff0c;使我们能够执行不同的任务。有多种方法可以使用Python及其库进行屏幕截图。…

开源电子画册源码系统 可重复利用 适合任何行业 带完整的搭建教程

电子画册&#xff0c;又称电子样本、电子商刊、电子杂志&#xff0c;是一种集合图片处理、文案策划、音乐加工、视频、统计调查、虚拟现实、三维动画等多种技术和表现形式为一体的多媒体画册&#xff0c;电子杂志是纸质印刷画册&#xff08;样本&#xff09;的升级版本&#xf…

创作者等级终于升到4级了

写了两个月的文章&#xff0c;终于等到4级了。发文纪念一下&#xff1a;

划片机:半导体工艺精细化高效化的新里程碑

随着科技的飞速发展&#xff0c;半导体已经成为现代电子设备的基石&#xff0c;而半导体晶圆的划片机作为半导体制造的核心设备之一&#xff0c;其发展程度直接关系到半导体的质量和产量。近年来&#xff0c;博捷芯精密划片机以其在半导体划片机领域的卓越表现&#xff0c;引领…