從0到1,Sphinx Windows本地安裝及PHP使用Sphinxapi示例

??最近一個(gè)項(xiàng)目需要實(shí)現(xiàn)這樣一個(gè)需求:mysql數(shù)據(jù)庫(kù)一張表中存了百萬(wàn)張菜品圖片,需要根據(jù)菜品名稱或描述,模糊匹配出符合條件的菜品圖片,并展示出來


select * from table_name where column like '%魚香肉絲%';

??如果像上面那樣,直接使用mysql like查詢的話,會(huì)進(jìn)行全表掃描,不走索引,大大的影響查詢效率,所以開始學(xué)習(xí)使用Sphinx全文搜索引擎,下面記錄下第一次配置使用的過程,以及過程中遇到的問題和疑問,望指正.

1. 下載sphinx源碼壓縮包點(diǎn)擊下載

按照自己的需求,下載對(duì)應(yīng)的版本,我這里下載的是Windows x64 binaries 3.1.1 版本

2. 下載后的sphinx源碼目錄
sphinx源碼目錄結(jié)構(gòu)
3.配置文件

打開etc目錄,里面有三個(gè)文件,example,sql是創(chuàng)建測(cè)試表的腳本,我們稍后會(huì)用到,sphinx.conf.dist是完整版默認(rèn)配置,這里我選擇了sphinx-min.conf.dist簡(jiǎn)化版,暫時(shí)可以滿足需求,復(fù)制一份到bin目錄下,并且重命名為sphinx.conf.


etc目錄
4. sphinx.config文件配置

配置文件的幾個(gè)組成部分:

  • source 數(shù)據(jù)源,這里配置你要進(jìn)行全文檢索的數(shù)據(jù)的來源
  • index 索引,從上面的數(shù)據(jù)源處構(gòu)建索引,相當(dāng)于字典檢索,要有整本字典內(nèi)容后才會(huì)有索引
  • indexer 構(gòu)建索引,需要重新構(gòu)建索引時(shí),其實(shí)就是調(diào)用indexer這個(gè)命令
  • searchd 提供搜索查詢的服務(wù),后臺(tái)運(yùn)行
source src1 ## src1為數(shù)據(jù)源命名的名稱,可以根據(jù)數(shù)據(jù)源的屬性更改
{
    type            = mysql ## 數(shù)據(jù)源,本項(xiàng)目使用mysql
    sql_host        = localhost ## 數(shù)據(jù)庫(kù)服務(wù)器,這里因?yàn)槭菧y(cè)試,使用的是本地?cái)?shù)據(jù)庫(kù)
    sql_user        = root # 數(shù)據(jù)庫(kù)用戶名
    sql_pass        = root # 數(shù)據(jù)庫(kù)密碼
    sql_db          = hongbao ## 數(shù)據(jù)庫(kù)名稱,替換成你自己的數(shù)據(jù)庫(kù)名稱
    sql_port        = 3306 ## 數(shù)據(jù)庫(kù)端口,默認(rèn)3306
    sql_query_pre   = SET NAMES utf8 ## 如果你的數(shù)據(jù)庫(kù)不是uft8編碼的,注釋掉本行
    sql_query       = \ ## 主查詢,查詢出所有在檢索范圍的數(shù)據(jù)
        SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
        FROM documents
    sql_attr_uint       = group_id ## 屬性
    sql_attr_timestamp  = date_added ## 屬性,可用來排序
}

index test1 ## 索引名稱,自行命名
{
    source          = src1 ## 基于這個(gè)數(shù)據(jù)源構(gòu)建索引
    path            = D:/sphinx/data/ ## 存放索引的目錄,自己創(chuàng)建
    charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F  ##  指定utf-8的編碼表
    mlock           = 0
    morphology      = none ## 詞形處理器,如果檢索中文用不到,dogs<==>dog
    min_word_len        = 1 ## 最小索引詞長(zhǎng)度,小于這個(gè)長(zhǎng)度的詞不會(huì)被索引
    ngram_len       = 1 ## 簡(jiǎn)單分詞,只支持0和1,如果要搜索中文,請(qǐng)指定為1
    ngram_chars     = U+3000..U+2FA1F ## 需要分詞的字符,如果要搜索中文,請(qǐng)放開這行
    html_strip      = 0 ## html標(biāo)記清理,是否從輸出全文數(shù)據(jù)中去除HTML標(biāo)記
}

indexer
{
    # memory limit, in bytes, kiloytes (16384K) or megabytes (256M)
    # optional, default is 128M, max is 2047M, recommended is 256M to 1024M
    mem_limit       = 128M ## 建立索引的時(shí)候,索引內(nèi)存限制
}

searchd
{
    listen          = 9312 ## 監(jiān)聽端口
    listen          = 9306:mysql41

    log         = D:/sphinx/log/searchd.log ## 監(jiān)聽日志
    query_log       = D:/sphinx/log/query.log ## 查詢?nèi)罩?    pid_file        = D:/sphinx/log/searchd.pid ## ## 進(jìn)程id文件
    read_timeout        = 5 ## 客戶端讀超時(shí)時(shí)間
    client_timeout      = 300 ## 客戶端持久連接超時(shí)時(shí)間,即客戶端讀一次以后,持久連接,然后再讀一次,中間這個(gè)持久連接的時(shí)間
    max_children        = 30 ## 并行執(zhí)行搜索的數(shù)目
    persistent_connections_limit    = 30
    preopen_indexes     = 1 ## 索引預(yù)開啟返顺,是否強(qiáng)制重新打開所有索引文件
    unlink_old      = 1 ## 索引輪換成功之后总寒,是否刪除以.old為擴(kuò)展名的索引拷貝
    max_packet_size     = 8M ## 網(wǎng)絡(luò)通訊時(shí)允許的最大的包的大小
    max_filters     = 256 ## 每次查詢?cè)试S設(shè)置的過濾器的最大個(gè)數(shù)
    max_filter_values   = 4096 ## 單個(gè)過濾器允許的值的最大個(gè)數(shù)
    max_batch_queries   = 32 ## 每次批量查詢的查詢數(shù)限制
    workers         = threads # for RT to work     多處理模式(MPM)。 可選項(xiàng)凝化;可用值為none宠进、fork渊抽、prefork建蹄,以及threads帆阳。 默認(rèn)在Unix類系統(tǒng)為form,Windows系統(tǒng)為threads氨距。

}



注:配置文件更改完成之后,回到根目錄新建配置文件中使用到的data和log兩個(gè)目錄

導(dǎo)入源碼里提供的示例數(shù)據(jù),執(zhí)行etc目錄下的example.sql腳本:


導(dǎo)入測(cè)試數(shù)據(jù)

或者使用mysql圖形處理界面工具:


導(dǎo)入測(cè)試數(shù)據(jù).png
5. 根據(jù)sphinx.conf創(chuàng)建索引
## 構(gòu)建索引語(yǔ)法:
indexer -c 配置文件 索引名字
  • 打開windows 命令提示行工具,進(jìn)入到sphinx/bin目錄下
根據(jù)sphinx.conf創(chuàng)建索引
  • 啟動(dòng)sphinx檢索服務(wù),后臺(tái)常駐
啟動(dòng)
  • 查看索引創(chuàng)建情況
    重新打開一個(gè)命令行窗口,
索引建立情況
6. Sphinxapi.php使用(或者安裝php擴(kuò)展)

sphinx提供了各種語(yǔ)言的代碼,php使用sphinx,只需要引入sphinxapi.php,打開根目錄下的api目錄,將sphinxapi.php文件復(fù)制到你的項(xiàng)目目錄下,方便調(diào)用

<?php
/**
 * Demo.php
 * Create on 2018/8/29 10:42
 * Create by liu
 * Administrator
 */

class Demo extends CI_Controller
{
    private $sphinx;
    public function __construct()
    {
        parent::__construct();
        require_once APPPATH . 'libraries/Sphinxapi.php';
        $this->sphinx = new SphinxClient();
    }

    public function sphinx()
    {
        //設(shè)置操作哪個(gè)sphinx服務(wù)器
        $this->sphinx->setServer('localhost',9312);
        $keyword = "銀行";//要搜索的關(guān)鍵字
        $index = 'bank';//索引名稱
        //查詢出關(guān)鍵字所在的主鍵id
        $this->sphinx->_limit = 2000;
        $res = $this->sphinx->Query($keyword,$index);
        echo '<pre>';

        if (isset($res['matches'])){
            $ids = array_keys($res['matches']);
            $ids = implode(',',$ids);
        }else{
            print_r("內(nèi)容不存在");
            return;
        }
        //獲取匹配到的主鍵id
        $mysql_con = mysqli_connect('localhost','root','','hongbao');//本地?cái)?shù)據(jù)庫(kù)
        mysqli_query($mysql_con,'set name utf8');
        mysqli_query($mysql_con,'use hongbao');
        $sql = "select * from bank where id in ($ids)";
        
        $res = mysqli_query($mysql_con,$sql);

        while ($row = mysqli_fetch_assoc($res)){
            $data[] = $row;
        }
        foreach ($data as $key => $v){

            $v = str_replace($keyword,"<font color='red'>{$keyword}</font>",$v);
            $data[$key] = $v;
        }
        print_r($data);

    }

}

代碼運(yùn)行結(jié)果


代碼運(yùn)行結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桑逝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俏让,更是在濱河造成了極大的恐慌楞遏,老刑警劉巖茬暇,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寡喝,居然都是意外死亡糙俗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門预鬓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巧骚,“玉大人,你說我怎么就攤上這事格二∨耄” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵顶猜,是天一觀的道長(zhǎng)沧奴。 經(jīng)常有香客問我,道長(zhǎng)长窄,這世上最難降的妖魔是什么滔吠? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任奠衔,我火速辦了婚禮蛋褥,結(jié)果婚禮上辖佣,老公的妹妹穿的比我還像新娘酿炸。我一直安慰自己番舆,他們只是感情好履澳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布御吞。 她就那樣靜靜地躺著宽堆,像睡著了一般郑原。 火紅的嫁衣襯著肌膚如雪唉韭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天犯犁,我揣著相機(jī)與錄音属愤,去河邊找鬼。 笑死酸役,一個(gè)胖子當(dāng)著我的面吹牛住诸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涣澡,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼贱呐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了入桂?” 一聲冷哼從身側(cè)響起奄薇,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抗愁,沒想到半個(gè)月后馁蒂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呵晚,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年沫屡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饵隙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沮脖,死狀恐怖金矛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勺届,我是刑警寧澤驶俊,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站涮因,受9級(jí)特大地震影響废睦,放射性物質(zhì)發(fā)生泄漏伺绽。R本人自食惡果不足惜养泡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奈应。 院中可真熱鬧澜掩,春花似錦、人聲如沸杖挣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惩妇。三九已至株汉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歌殃,已是汗流浹背乔妈。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氓皱,地道東北人路召。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像波材,于是被迫代替她去往敵國(guó)和親股淡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容