mysql全文索引thinkphp_ThinkPHP5 使用迅搜 (XunSearch) 實現全文檢索實例指導

前期準備

入坑了一天,折騰的無語,個人觀點:【文檔太差,適合學習思路,不建議入坑】

背景

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

注意到 xunsearch 的評價很高,在此記錄一番

場景描述

此處作為對 xunsearch 的初次使用,

以一個簡單的商品 SKU 信息搜索場景進行描述

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

主鍵為 "sku_id",需要進行匹配的字段為:"spec_name"

ce4b71a30ac4d27664d923d0fa342201.png

環境

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

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

790134f33aa9662ada98cc5522211217.png

因為我的 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 兩個端口的訪問權限

0b19be22ad52249e438a866c21ef85b4.png

啟動完成后,可以輸入命令查看服務的運行狀態: "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" 目錄下,生成兩個相關文件夾

2a12c0b1c37a1f20fbdc313f5551a457.png

檢測 PHP-SDK 的運行條件

此時,可以在 "vendor\hightman\xunsearch\util" 目錄中

運行 php 指令:php RequiredCheck.php

533de50df0ca8ed4b72c269450db8842.png

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()" 的第一個參數可得到如下數據:

14c1b332ae0ff49213a678d914894e6d.png

在此,我設置查詢的文字為:"我找原味的瓜子和爆款藍牙"

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

運行匹配得到的結果集如下:

090fc35d443a8ce786818ec63fa8d5e6.png

從結果上來看,還是可以接受的

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

156b214abce856b5b4525c1d7c5050c7.png

②. 一點點拙見

提示: 目測官方沒有好的精力去升級優化,論壇也沒法訪問,好多問題找不到探討 ...

忍不住吐槽

學習過程中

網上的例子比較少,遇到問題不好解答

比較失望的是,官方文檔說的不清楚,需要多次測試,碰運氣的感覺

好歹給個參考實例,演示代碼實現過程吧!!

再給個贊賞

話又說回來

作為開源項目為大家提供便利

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

希望,同道中人少踩幾個坑,共同進步,謝謝 ...

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

如有侵權,請聯系 support@oschina.cn 刪除。

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539678.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為何有些程序員總是想要“干掉”產品經理?

好了,我準備去和產品經理做斗爭去了,請祝我好運吧!小編花了大量時間收集了很多干貨編程學習資源,其中資源包括 算法,大數據,人工智能,Python,Android,iOS,Jav…

多個left join 產生多個結果

select a.*,to_char(To_date(20160403000000, yyyyMMddhh24miss),yyyy/mm/dd) as omc_start_time,to_char(To_date(20160404000000, yyyyMMddhh24miss),yyyy/mm/dd) as omc_end_time,ROUND(sc."切換成功率",2) AS "OMC-源小區切換成功率%",ROUND(sc."…

查看進程占用,并kill掉

今天發現8899端口被占,服務器啟動失敗,用了下面的命令解決。 [rootltesqm Toolbox]# netstat -tunlp |grep 8899 tcp 0 0 :::8899 :::* LISTEN 28279/java [rootltesqm Toolbox]…

Spark算子篇 --Spark算子之combineByKey詳解

一。概念 rdd.combineByKey(lambda x:"%d_" %x, lambda a,b:"%s%s" %(a,b), lambda a,b:"%s$%s" %(a,b))三個參數(都是函數)第一個參數:給定一個初始值,用函數生成初始值。第二個參數:c…

mysql proxy 主從_【MYSQL知識必知必會】MySQL主從復制讀寫分離(基于mysql-proxy實現)...

MySQL主從復制讀寫分離(基于mysql-proxy實現)http://mirror.bit.edu.cn/mysql/Downloads/MySQL-Proxy/mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz解壓tar zxvf mysql-proxy-0.8.4-linux-glibc2.3-x86-64bit.tar.gz創建mysql-proxy帳號并授權分別在主從數據庫中創建mys…

SecureCRT防止自動斷開

今天在寧波連接上海的linux庫,是外網訪問內網,使用了nat123這個軟件映射的。 發現SecureCRT連接后,過幾分鐘就自動斷開,導致使用SecureCRT做跳轉機的其他應用使用起來很不方便。 于是設置了下SecureCRT。

mysql 主主結構_高性能mysql主主架構

(3)配置參數說明server-id:ID值唯一的標識了復制群集中的主從服務器,因此它們必須各不相同。master_id必須為1到232–1之間的一個正整數值,slave_id值必須為2到232–1之間的一個正整數值。log-bin:表示打開binlog,打開該選項才可以…

解決ios編譯swift報錯pcm was built: mtime changed

問題 編譯ios工程失敗時,其中的幾個swift文件報以下錯 /Users/tomes/code/project/xxx.swift File /Users/tomes/Library/Developer/Xcode/DerivedData/Spec-dgyhrnmgvfkjkqbboklnfgrudqip/Build/Products/Debug-iphoneos/xxxx.framework/Headers/xxxx.h has been…

AI工程師職業規劃和學習路線完整版

AI工程師職業規劃和學習路線完整版 如何成為一名機器學習算法工程師 成為一名合格的開發工程師不是一件簡單的事情,需要掌握從開發到調試到優化等一系列能 力,這些能力中的每一項掌握起來都需要足夠的努力和經驗。而要成為一名合格的機器學習算法工程師&…

oracle 多個with as

主要看多個with的格式 [sql] view plaincopy WITH T3 AS ( SELECT T1.ID, T1.CODE1, T2.DESCRIPTION FROM TB_DATA T1, TB_CODE T2 WHERE T1.CODE1 T2.CODE ), T4 AS ( SELECT T1.ID, T1.CODE2, T2.DESCRIPTION FROM TB_DATA T1, TB_CODE T2 WHERE T1.C…

mysql主鍵 命中率_mysql主鍵問題

MySQL主鍵一. MySQL主鍵設計原則MySQL主鍵應當是對用戶沒有意義的。MySQL主鍵應該是單列的,以便提高連接和篩選操作的效率(當然復合主鍵是可以的,只是不建議)永遠也不要更新MySQL主鍵MySQL主鍵不應包含動態變化的數據,如時間戳、創建時間列、…

Centos7常用命令[掛載文件系統]

Centos7常用命令[掛載文件系統]------------------------------------------------------------------------------# 掛載一個叫做hda2的盤-確定目錄/mnt/hda2已經存在[rootlocalhost ~]# mount /dev/hda2 /mnt/hda2# 卸載一個叫做hda2的盤-先從掛載點/mnt/hda2退出[rootlocalh…

hadoop SecondNamenode

一、定義 * The Secondary Namenode is a helper to the primary Namenode. * The Secondary is responsible for supporting periodic checkpoints * of the HDFS metadata. The current design allows only one Secondary * Namenode per HDFs cluster. * The Secondary Nam…

Tensorflow Python API 翻譯(sparse_ops)

作者:chen_h 微信號 & QQ:862251340 微信公眾號:coderpai 我的博客:請點擊這里計劃現將 tensorflow 中的 Python API 做一個學習,這樣方便以后的學習。 原文鏈接該章介紹有關稀疏張量的API稀疏張量表示對于多維稀疏…

高性能mysql 小查詢_高性能MySql進化論(十一):常見查詢語句的優化

總結一下常見查詢語句的優化方式1 COUNT1. COUNT的作用 COUNT(table.filed)統計的該字段非空值的記錄行數 COUNT(*)或者是COUNT(not nullable field) 統計的是全表的行數如果要是統計全表記錄數,COUNT(*)效率會比COUNT(not nullable fie…

ORA-01861: 文字與格式字符串不匹配

select to_date(20160401000000,yyyy-mm-dd) from dual; ---------- 報錯:ORA-01861: 文字與格式字符串不匹配 原因:字符串20160401000000與要轉換的格式 yyyy-mm-dd 格式不對。 20160401000000 是 yyyymmddhh24miss 格式的 -------- select to_da…

首席架構師徐海峰眼中的架構和出色的架構師

CSDN架構領域編輯采訪了一些與會講師,談談他們將在會上分享的內容、相關技術和程序人生,帶你領略講師風采。 本期我們采訪的講師是來自閱文集團首席架構師徐海峰,主要負責內容中心的網站架構和分布式存儲、分布式計算工作。10年互聯網開發經驗…

java socket建立長連接_Java Web項目中使用Socket通信多線程、長連接的方法

很多時候在javaweb項目中我們需要用到Socket通信來實現功能,在web中使用Socket我們需要建立一個監聽程序,在程序啟動時,啟動socket監聽。我們的應用場景是在java項目中,需要外接如一個硬件設備,通過tcp通信&#xff0c…

hadoop-eclipse-plugin使用

下載hadoop安裝包:http://www.carfab.com/apachesoftware/hadoop/common/hadoop-1.0.2/ 但是沒有plugin,我到這個地方下載的:http://ishare.iask.sina.com.cn/f/23642243.html?fromlikecopy到你的eclipse_home的plugins下面。配置map/reduce…

hadoop eclipse plugin windows下載集合

收集了hadoop穩定版本的eclipse plugin for windows。資源分一律為0分 hadoop-eclipse-plugin-1.2.1.jar http://download.csdn.net/detail/zengmingen/9488180 hadoop-eclipse-plugin-2.2.0.jar http://download.csdn.net/detail/zengmingen/9488182 hadoop-eclipse-pl…