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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

使用PHP+Sphinx建立高效的站内搜索引擎

發布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用PHP+Sphinx建立高效的站内搜索引擎 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.??? 為什么要使用Sphinx

?

假設你現在運營著一個論壇,論壇數據已經超過100W,很多用戶都反映論壇搜索的速度非常慢,那么這時你就可以考慮使用Sphinx了(當然其他的全文檢索程序或方法也行)。

?

2.??? Sphinx是什么

?

Sphinx由俄羅斯人Andrew Aksyonoff 開發的高性能全文搜索軟件包,在GPL與商業協議雙許可協議下發行。

全文檢索是指以文檔的全部文本信息作為檢索對象的一種信息檢索技術。檢索的對象有可能是文章的標題,也有可能是文章的作者,也有可能是文章摘要或內容。

?

3.??? Sphinx的特性

?

l? 高速索引 (在新款CPU上,近10 MB/秒);

l? 高速搜索 (2-4G的文本量中平均查詢速度不到0.1秒);

l? 高可用性 (單CPU上最大可支持100 GB的文本,100M文檔);

l? 提供良好的相關性排名

l? 支持分布式搜索;

l? 提供文檔摘要生成;

l? 提供從MySQL內部的插件式存儲引擎上搜索

l? 支持布爾,短語, 和近義詞查詢;

l? 支持每個文檔多個全文檢索域(默認最大32個);

l? 支持每個文檔多屬性;

l? 支持斷詞;

l? 支持單字節編碼與UTF-8編碼;

?

4.??? 下載并安裝Sphinx

?

打開網址http://www.coreseek.cn/news/7/52/ 找到適合自己的操作系統的版本,比如我是Windows那么我就可以下載Coreseek Win32通用版本,Linux下可以下載源碼包,自己編譯安裝。這里解釋下為什么我們下載的程序叫Coreseek,Coreseek是基于Sphinx開發的一款軟件,對Sphinx做了一些改動,在中文方面支持得比Sphinx好,所以我們使用之。

下載完成后,將程序解壓到你想解壓的地方,比如我就想解壓到E盤根目錄,之后修改目錄名為Coreseek,大功告成Coreseek安裝完成了,安裝的目錄是在E:\coreseek\。

?

5.??? 使用Sphinx

?

我要使用Sphinx需要做以下幾件事

1)??????? 首先得有數據

2)??????? 建立Sphinx配置文件

3)??????? 生成索引

4)??????? 啟動Sphinx

5)??????? 使用之(調用api或search.exe程序進行查詢)

?

第1件:(導入數據)

我們建立測試所需要用到得數據庫、表以及數據,篇幅有限,這些在附件中都有,下載后導入MySQL即可。

?

第2件:(建立配置文件)

接下來我們需要建立一個Sphinx的配置文件 E:\coreseek\etc\mysql.conf,將其內容改為下面這些:

source mysql

{

?????? type????????????????????????????????? ?????? = mysql

?????? sql_host????????????????????? ?????? ?????? = localhost?

?????? sql_user????????????????????? ?????? ?????? = root??????????

?????? sql_pass??????????????????????????? ?????? ?????? =???????????

?????? sql_db?????????????????????????????? ?????? = test???????????

?????? sql_port????????????????????? ?????? ?????? = 3306?????????

?????? sql_query_pre???????????????????????? = SET NAMES utf8

?????? sql_query????????????????????????? ?????? = SELECT id,addtime,title,content FROM post

?????? sql_attr_timestamp???????????????? = addtime

}

?

index mysql

{

?????? source?????????????????????????????? ?????? = mysql

?????? path????????????????????????????????? ?????? = E:/coreseek/var/data/mysql

?????? charset_dictpath?????????????????? = E:/coreseek/etc/

?????? charset_type?????????????????????????? = zh_cn.utf-8

}

?

searchd

{

?????? listen????????????????????????????????? ?????? = 9312

?????? max_matches???????????????????????? = 1000

?????? pid_file?????????????????????? ?????? ?????? = E:/coreseek/var/log/searchd_mysql.pid

?????? log????????????????????????????? ????????????? = E:/coreseek/var/log/searchd_mysql.log

?????? query_log???????????????????????? ?????? = E:/coreseek/var/log/query_mysql.log

}

?

先講下這個配置文件中每項的含義。

source mysql{} 定義源名稱為mysql,也可以叫其他的,比如:source xxx{}

type? 數據源類型

sql_* 數據相關的配置,比如sql_host,sql_pass什么的,這些不解釋鳥

sql_query 建立索引時的查詢命令,在這里盡可能不使用where或group by,將where與groupby的內容交給sphinx,由sphinx進行條件過濾與groupby效率會更高,注意:select 的字段必須包括一個唯一主鍵以及要全文檢索的字段,where中要用到的字段也要select出來

sql_query_pre 在執行sql_query前執行的sql命令, 可以有多條

sql_attr 以這個開頭的配置項,表示屬性字段,在where,orderby,groupby中出現的字段要分別定義一個屬性,定義不同類型的字段要用不同的屬性名,比如上面的sql_attr_timestamp就是時間戳類型。

?

index mysql{} 定義索引名稱為mysql,也可以叫其他的,比如:index xxx{}

source 關聯源,就是source xxx定義的。

path 索引文件存放路徑,比如:E:/coreseek/var/data/mysql 實際存放在E:/coreseek/var/data/目錄,然后創建多個名稱為mysql后綴卻不同的索引文件

charset_dictpath? 指明分詞法讀取詞典文件的位置,當啟用分詞法時,為必填項。在使用LibMMSeg作為分詞 庫時,需要確保詞典文件uni.lib在指定的目錄下

charset_type 字符集,比如charset_type = zh_cn.gbk

?

searchd{} sphinx守護進程配置

listen 監聽端口

max_matches最大匹配數,也就是查找的數據再多也只返回這里設置的1000條

pid_file pid文件路徑

log全文檢索日志

query_log查詢日志

?

好了,配置文件就這樣,配置的參數還有很多,大家可以自己查文檔。

?

第3件:(生成索引)

開始 -> 運行 -> 輸入cmd回車,打開命令行工具

e:\coreseek\bin\indexer --config e:\coreseek\etc\mysql.conf --all

這一串東西其實就是調用indexer程序來生成所有索引

?

如果只想對某個數據源進行索引,則可以這樣:e:\coreseek\bin\indexer --config e:\coreseek\etc\mysql.conf 索引名稱(索引名稱指配置文件中所定義的)

--config,--all這些都是indexer程序的參數,想了解更多參數的朋友可以查看文檔

運行命令后如果你沒看到FATAL,ERROR這些東西,那么索引文件就算生成成功了,比如我看到得就是

………省略………

using config file 'e:\coreseek\etc\mysql.conf'...

indexing index 'mysql'...

collected 4 docs, 0.0 MB

………省略………

?

第4件:(啟動Sphinx)

同樣命令行下

e:\coreseek\bin\searchd --config e:\coreseek\etc\mysql.conf

運行后提示了一大堆東西

using config file 'e:\coreseek\etc\mysql.conf'...

listening on all interfaces, port=9312

accepting connections

不用管這些鳥文是啥意思,反正Sphinx是啟動好了。

現在有一串鳥文的這個命令行是不能關的,因為關了Sphinx也就關了,如果覺得這樣不爽,可以將Sphinx安裝成系統服務,在后臺運行。

安裝系統服務只需在命令行中輸入以下命令

e:\coreseek\bin\searchd --config e:\coreseek\etc\mysql.conf --install

安裝之后記得啟動這個服務,不會啟動那我沒法,自己google。

?

第5步:(使用Sphinx)

在web根目錄下建立一個search目錄(當然不在根目錄也行,同樣目錄名也可以隨取),復制E:\coreseek\api\ sphinxapi.php文件到search目錄(sphinxapi.php這個是sphinx官方提供的api),開始php程序的編寫。

在search目錄建立一個文件,名字叫啥都行,我管它叫index.php,其內容如下

<?php

?

include 'sphinxapi.php';? // 加載Sphinx API

?

$sc = new SphinxClient(); // 實例化Api

$sc->setServer('localhost', 9312); // 設置服務端,第一個參數sphinx服務器地址,第二個sphinx監聽端口

$res = $sc->query('sphinx', 'mysql'); // 執行查詢,第一個參數查詢的關鍵字,第二個查詢的索引名稱,mysql索引名稱(這個也是在配置文件中定義的),多個索引名稱以,分開,也可以用*表示所有索引。

print_r($res);

?

打印結果:

Array

(

?? ………省略………

??? [matches] => Array

??????? (

??????????? [2] => Array

??????????????? (

??????????????????? [weight] => 2

??????????????????? [attrs] => Array

??????????????????????? (

??????????????????????????? [addtime] => 1282622004

??????????????????????? )

??????????????? )

??????????? [4] => Array

??????????????? (

??????????????????? [weight] => 2

??????????????????? [attrs] => Array

??????????????????????? (

??????????????????????????? [addtime] => 1282622079

??????????????????????? )

??????????????? )

??????? )

? ………省略………

)

Matches中就是查詢的結果了,但是仿佛不是我們想要的數據,比如titile,content字段的內容就沒有查詢出來,根據官方的說明是Sphinx并沒有連接到MySQL去取數據,只是根據它自己的索引內容進行計算,因此如果想用Sphinx提供的API去取得我們想要的數據,還必須以查詢的結果為依據,再次查詢MySQL從而得到我們想要的數據。

?

查詢結果中鍵值分別表示

另類方式實現PHP后臺運行

總結

以上是生活随笔為你收集整理的使用PHP+Sphinx建立高效的站内搜索引擎的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。