日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql全文索引thinkphp_ThinkPHP5 使用迅搜 (XunSearch) 实现全文检索实例指导

發(fā)布時(shí)間:2025/3/11 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql全文索引thinkphp_ThinkPHP5 使用迅搜 (XunSearch) 实现全文检索实例指导 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前期準(zhǔn)備

入坑了一天,折騰的無語,個(gè)人觀點(diǎn):【文檔太差,適合學(xué)習(xí)思路,不建議入坑】

背景

最近在整理全文檢索解決方案

注意到 xunsearch 的評(píng)價(jià)很高,在此記錄一番

場(chǎng)景描述

此處作為對(duì) xunsearch 的初次使用,

以一個(gè)簡單的商品 SKU 信息搜索場(chǎng)景進(jìn)行描述

我已有一張 tp5_xsku表,用來存儲(chǔ)商品 SKU 信息

主鍵為 "sku_id",需要進(jìn)行匹配的字段為:"spec_name"

環(huán)境

PHP:php7.2.9

Linux:CentOS7.9

MySQL:mysql5.7.32

? XunSearch 服務(wù)端搭建

此處,我將網(wǎng)站應(yīng)用部署在本地 windows 環(huán)境

然后,使用一臺(tái)虛擬機(jī) 【192.168.80.224】作為 xunsearch 服務(wù)器的部署環(huán)境

1). 運(yùn)行下面指令下載、解壓安裝包

此處,我選擇的是一臺(tái) CentOS7 的虛擬機(jī) [ip:192.168.80.224],作為服務(wù)端

wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2

tar -xjf xunsearch-full-latest.tar.bz2

2). 執(zhí)行安裝腳本

首先,建議將解壓后的文件夾移動(dòng)到 "usr/local/" 目錄下

此處,我做了文件夾重命名、拷貝操作

mv xunsearch-full-1.4.15/ xunsearch

cp -r xunsearch /usr/local/xunsearch

然后執(zhí)行安裝腳本命令

選擇默認(rèn)即可(第一次安裝的話,過程可能會(huì)稍顯漫長)

cd /usr/local/xunsearch/

sh setup.sh

一般沒啥問題,最終成功提示信息如下:

因?yàn)槲业?SDK 調(diào)用和 xunsearch 服務(wù)端不在同一服務(wù)器,所以使用 -b inet 方式啟動(dòng)腳

/usr/local/xunsearch/bin/xs-ctl.sh -b inet start

【提示】:

注意官方建議的 不同啟動(dòng)方式,不然坑死你

其次,測(cè)試發(fā)現(xiàn),如果我直接刪掉了 "/usr/local/xunsearch/data" 文件夾,后續(xù)直接沒反應(yīng)

需要重啟 xunsearch 服務(wù)方可!(也沒見官網(wǎng)提示)

3). 設(shè)置端口號(hào)

通過對(duì) xunsearch 的啟動(dòng)命令操作發(fā)現(xiàn),需要有端口號(hào) "8383、8384" 的支持

注意借助類似 iptables 的防火墻,

來控制 xunsearch 的 8383/8384 兩個(gè)端口的訪問權(quán)限

啟動(dòng)完成后,可以輸入命令查看服務(wù)的運(yùn)行狀態(tài): "ps -ef | grep xs-searchd"

[root@localhost ~]# ps -ef | grep xs-searchd

root 2431 1 0 13:25 ? 00:00:00 xs-searchd: master

root 2432 2431 0 13:25 ? 00:00:00 xs-searchd: worker[1]

root 2433 2431 0 13:25 ? 00:00:00 xs-searchd: worker[2]

root 2434 2431 0 13:25 ? 00:00:00 xs-searchd: worker[3]

root 2487 2397 0 13:29 pts/0 00:00:00 grep --color=auto xs-searchd

4). 設(shè)置開機(jī)啟動(dòng)

建議將 xunsearch 添加到開機(jī)啟動(dòng)腳本中,以便每次服務(wù)器重啟后能自動(dòng)啟動(dòng)搜索服務(wù)程序

在 Linux 系統(tǒng)中,

可以將腳本指令 "/usr/local/xunsearch/bin/xs-ctl.sh -b inet start"

寫進(jìn) "/etc/rc.local" 文件,然后保存退出即可

vi /etc/rc.local

? ThinkPHP5 應(yīng)用框架的配置

此處,注意,應(yīng)用框架跟前面的 "XunSearch" 服務(wù)端不在一個(gè) ip 地址

1). composer 安裝 sdk

進(jìn)入項(xiàng)目根目錄,執(zhí)行 composer 指令如下:

composer require --prefer-dist hightman/xunsearch "*@beta"

此時(shí),會(huì)在 "vendor" 目錄下,生成兩個(gè)相關(guān)文件夾

檢測(cè) PHP-SDK 的運(yùn)行條件

此時(shí),可以在 "vendor\hightman\xunsearch\util" 目錄中

運(yùn)行 php 指令:php RequiredCheck.php

2). 配置文件的修改

對(duì)于配置文件的詳細(xì)解釋,建議閱讀文檔 —— 【xunsearch 項(xiàng)目配置文件詳解】

每個(gè)搜索項(xiàng)目必須有且僅有一個(gè) type=id 字段,確保每條數(shù)據(jù)具備唯一值,是索引更新和刪除的憑據(jù)

可以參考 "vendor/hightman/xunsearch/app/demo.ini" 文件

創(chuàng)建屬于自己業(yè)務(wù)的配置文件

我新建了一個(gè)"goods_sku.ini" 文件,配置參考如下:

project.name = goods_sku

project.default_charset = utf-8

server.index = 192.168.80.224:8383

server.search = 192.168.80.224:8384

[sku_id]

type = id

[spec_name]

type = string

index = both

3). 集成方法類 "XunseachService" 的使用

根據(jù)網(wǎng)上的一些經(jīng)驗(yàn),建議,創(chuàng)建一個(gè)集成方法類

此處,提供 "XunsearchService.php" 的源碼,方便參考使用

namespace app\common\lib;

/**

* xunsearch 集成使用類

* Class XunsearchService

* @package app\common\lib

*/

class XunsearchService

{

/**

* 中文分詞搜索

* @param string $keywords 關(guān)鍵詞

* @param string $file ini文件名

* @param bool $is_scws 是否開啟中文分詞(例如:口袋新世代,拆分成:口袋、新、世代)

* @param int $limit 搜索結(jié)果條數(shù)

* @return array 返回結(jié)果

* @throws \XSException

*/

public static function search($keywords,$file = 'demo',$is_scws = false,$limit = 100){

$xs = new \XS($file);

if($is_scws === true) {

//中文分詞

$tokenizer = new \XSTokenizerScws;

//詞語拆分

$words = $tokenizer->getTokens($keywords);

$where = '';

//拼接成查詢條件(OR)

foreach ($words as $key => $val) {

if ($key == 0) {

$where = $val;

} else {

$where .= ' OR ' . $val;

}

}

}else {

$where = $keywords;

}

$search = $xs->search;

$result = $xs->search->setQuery($where)

//->setSort('sku_id','asc') #按索引排序

->setDocOrder(true) #按添加索引排序(升序)

->setLimit($limit)

->search();

$search->close();

return $result;

}

/**

* 新增/更新/刪除 xunsearch 數(shù)據(jù)庫

* @param array $data

* @param string $file ini文件名

* @param string $tag 'add':新增;'update':更新;'[主鍵ID]':刪除

* @return bool

*/

public function save($data,$file = 'demo',$tag = 'add'){

try {

$xs = new \XS($file);

#創(chuàng)建文檔對(duì)象

$doc = new \XSDocument;

$doc->setFields($data);

#更新(新增)數(shù)據(jù)

$index = $xs->index;

if ($tag == 'add'){

$index->add($doc);

}elseif ($tag == 'update'){

$index->update($doc);

}else{

// 此處,傳來的是作為主鍵的值

$index->del($tag);

}

#強(qiáng)制刷新當(dāng)前索引列表數(shù)據(jù)

return $index->flushIndex();

}catch (\Exception $e){

return false;

}

}

}

新建類名可自定義,基本沒啥疑問

4). 增加索引的操作

在商品 SKU 數(shù)據(jù)操作變化的業(yè)務(wù)邏輯位置,添加如下代碼:

(注意傳參的不同,此處只是演示了增加的操作)

$xs_data = [

'sku_id' => $sku_ID,

'spec_name' => $spec_name

];

$xsService = new XunsearchService();

$xsService::save($xs_data,'goods_sku');

提示

如果操作成功,你會(huì)在 xunsearch服務(wù)端的 "data"目錄下發(fā)現(xiàn)一個(gè) "goods_sku" 的文件夾

5). 索引查詢操作

在需要進(jìn)行查詢操作的位置,補(bǔ)充如下代碼:

(后續(xù)便是根據(jù)返回的數(shù)組,然后匹配業(yè)務(wù)數(shù)據(jù)表的 sku_id ,進(jìn)行商品信息的展示了 …)

$xsService = new XunsearchService();

try {

$message = $xsService::search('我找原味的瓜子和爆款藍(lán)牙', 'goods_sku', true);

} catch (\XSException $e) {

$message = $e->getMessage();

}

var_dump($message);

? 附錄

①. 代碼檢索測(cè)試

首先,我觸發(fā)"$xsService->save()" 事件,得到了六個(gè)數(shù)據(jù)

然后,在查詢操作時(shí),置空 "$xsService::search()" 的第一個(gè)參數(shù)可得到如下數(shù)據(jù):

在此,我設(shè)置查詢的文字為:"我找原味的瓜子和爆款藍(lán)牙"

代碼處理,得到的查詢語句為:"我找 OR 找 OR 原味 OR 的 OR 瓜子 OR 和 OR 和爆 OR 爆款 OR 款 OR 藍(lán)牙"

運(yùn)行匹配得到的結(jié)果集如下:

從結(jié)果上來看,還是可以接受的

不過,此處可以注意到拆分的名詞還是差點(diǎn)意思,可對(duì)比參考下 —— 【HanLP 在線演示】

②. 一點(diǎn)點(diǎn)拙見

提示: 目測(cè)官方?jīng)]有好的精力去升級(jí)優(yōu)化,論壇也沒法訪問,好多問題找不到探討 ...

忍不住吐槽

學(xué)習(xí)過程中

網(wǎng)上的例子比較少,遇到問題不好解答

比較失望的是,官方文檔說的不清楚,需要多次測(cè)試,碰運(yùn)氣的感覺

好歹給個(gè)參考實(shí)例,演示代碼實(shí)現(xiàn)過程吧!!

再給個(gè)贊賞

話又說回來

作為開源項(xiàng)目為大家提供便利

本身就是值得贊賞的,太過吹毛求疵就不好了!

希望,同道中人少踩幾個(gè)坑,共同進(jìn)步,謝謝 ...

本文同步分享在 博客“moTzxx”(CSDN)。

如有侵權(quán),請(qǐng)聯(lián)系 support@oschina.cn 刪除。

本文參與“OSC源創(chuàng)計(jì)劃”,歡迎正在閱讀的你也加入,一起分享。

總結(jié)

以上是生活随笔為你收集整理的mysql全文索引thinkphp_ThinkPHP5 使用迅搜 (XunSearch) 实现全文检索实例指导的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。