前期準備
入坑了一天,折騰的無語,個人觀點:【文檔太差,適合學習思路,不建議入坑】
背景
最近在整理全文檢索解決方案
注意到 xunsearch 的評價很高,在此記錄一番
場景描述
此處作為對 xunsearch 的初次使用,
以一個簡單的商品 SKU 信息搜索場景進行描述
我已有一張 tp5_xsku表,用來存儲商品 SKU 信息
主鍵為 "sku_id",需要進行匹配的字段為:"spec_name"
環境
PHP:php7.2.9
Linux:CentOS7.9
MySQL:mysql5.7.32
? XunSearch 服務端搭建
此處,我將網站應用部署在本地 windows 環境
然后,使用一臺虛擬機 【192.168.80.224】作為 xunsearch 服務器的部署環境
1). 運行下面指令下載、解壓安裝包
此處,我選擇的是一臺 CentOS7 的虛擬機 [ip:192.168.80.224],作為服務端
wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2
tar -xjf xunsearch-full-latest.tar.bz2
2). 執行安裝腳本
首先,建議將解壓后的文件夾移動到 "usr/local/" 目錄下
此處,我做了文件夾重命名、拷貝操作
mv xunsearch-full-1.4.15/ xunsearch
cp -r xunsearch /usr/local/xunsearch
然后執行安裝腳本命令
選擇默認即可(第一次安裝的話,過程可能會稍顯漫長)
cd /usr/local/xunsearch/
sh setup.sh
一般沒啥問題,最終成功提示信息如下:
因為我的 SDK 調用和 xunsearch 服務端不在同一服務器,所以使用 -b inet 方式啟動腳
/usr/local/xunsearch/bin/xs-ctl.sh -b inet start
【提示】:
注意官方建議的 不同啟動方式,不然坑死你
其次,測試發現,如果我直接刪掉了 "/usr/local/xunsearch/data" 文件夾,后續直接沒反應
需要重啟 xunsearch 服務方可!(也沒見官網提示)
3). 設置端口號
通過對 xunsearch 的啟動命令操作發現,需要有端口號 "8383、8384" 的支持
注意借助類似 iptables 的防火墻,
來控制 xunsearch 的 8383/8384 兩個端口的訪問權限
啟動完成后,可以輸入命令查看服務的運行狀態: "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). 設置開機啟動
建議將 xunsearch 添加到開機啟動腳本中,以便每次服務器重啟后能自動啟動搜索服務程序
在 Linux 系統中,
可以將腳本指令 "/usr/local/xunsearch/bin/xs-ctl.sh -b inet start"
寫進 "/etc/rc.local" 文件,然后保存退出即可
vi /etc/rc.local
? ThinkPHP5 應用框架的配置
此處,注意,應用框架跟前面的 "XunSearch" 服務端不在一個 ip 地址
1). composer 安裝 sdk
進入項目根目錄,執行 composer 指令如下:
composer require --prefer-dist hightman/xunsearch "*@beta"
此時,會在 "vendor" 目錄下,生成兩個相關文件夾
檢測 PHP-SDK 的運行條件
此時,可以在 "vendor\hightman\xunsearch\util" 目錄中
運行 php 指令:php RequiredCheck.php
2). 配置文件的修改
對于配置文件的詳細解釋,建議閱讀文檔 —— 【xunsearch 項目配置文件詳解】
每個搜索項目必須有且僅有一個 type=id 字段,確保每條數據具備唯一值,是索引更新和刪除的憑據
可以參考 "vendor/hightman/xunsearch/app/demo.ini" 文件
創建屬于自己業務的配置文件
我新建了一個"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" 的使用
根據網上的一些經驗,建議,創建一個集成方法類
此處,提供 "XunsearchService.php" 的源碼,方便參考使用
namespace app\common\lib;
/**
* xunsearch 集成使用類
* Class XunsearchService
* @package app\common\lib
*/
class XunsearchService
{
/**
* 中文分詞搜索
* @param string $keywords 關鍵詞
* @param string $file ini文件名
* @param bool $is_scws 是否開啟中文分詞(例如:口袋新世代,拆分成:口袋、新、世代)
* @param int $limit 搜索結果條數
* @return array 返回結果
* @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 數據庫
* @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);
#創建文檔對象
$doc = new \XSDocument;
$doc->setFields($data);
#更新(新增)數據
$index = $xs->index;
if ($tag == 'add'){
$index->add($doc);
}elseif ($tag == 'update'){
$index->update($doc);
}else{
// 此處,傳來的是作為主鍵的值
$index->del($tag);
}
#強制刷新當前索引列表數據
return $index->flushIndex();
}catch (\Exception $e){
return false;
}
}
}
新建類名可自定義,基本沒啥疑問
4). 增加索引的操作
在商品 SKU 數據操作變化的業務邏輯位置,添加如下代碼:
(注意傳參的不同,此處只是演示了增加的操作)
$xs_data = [
'sku_id' => $sku_ID,
'spec_name' => $spec_name
];
$xsService = new XunsearchService();
$xsService::save($xs_data,'goods_sku');
提示
如果操作成功,你會在 xunsearch服務端的 "data"目錄下發現一個 "goods_sku" 的文件夾
5). 索引查詢操作
在需要進行查詢操作的位置,補充如下代碼:
(后續便是根據返回的數組,然后匹配業務數據表的 sku_id ,進行商品信息的展示了 …)
$xsService = new XunsearchService();
try {
$message = $xsService::search('我找原味的瓜子和爆款藍牙', 'goods_sku', true);
} catch (\XSException $e) {
$message = $e->getMessage();
}
var_dump($message);
? 附錄
①. 代碼檢索測試
首先,我觸發"$xsService->save()" 事件,得到了六個數據
然后,在查詢操作時,置空 "$xsService::search()" 的第一個參數可得到如下數據:
在此,我設置查詢的文字為:"我找原味的瓜子和爆款藍牙"
代碼處理,得到的查詢語句為:"我找 OR 找 OR 原味 OR 的 OR 瓜子 OR 和 OR 和爆 OR 爆款 OR 款 OR 藍牙"
運行匹配得到的結果集如下:
從結果上來看,還是可以接受的
不過,此處可以注意到拆分的名詞還是差點意思,可對比參考下 —— 【HanLP 在線演示】
②. 一點點拙見
提示: 目測官方沒有好的精力去升級優化,論壇也沒法訪問,好多問題找不到探討 ...
忍不住吐槽
學習過程中
網上的例子比較少,遇到問題不好解答
比較失望的是,官方文檔說的不清楚,需要多次測試,碰運氣的感覺
好歹給個參考實例,演示代碼實現過程吧!!
再給個贊賞
話又說回來
作為開源項目為大家提供便利
本身就是值得贊賞的,太過吹毛求疵就不好了!
希望,同道中人少踩幾個坑,共同進步,謝謝 ...
本文同步分享在 博客“moTzxx”(CSDN)。
如有侵權,請聯系 support@oschina.cn 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。