1. 使用Sphinx對索引進行搜索
Sphinx對索引進行搜索主要分為以下幾步 用戶輸入查詢語句
對查詢語句進行詞法分析 語法分析 及語言處理
搜索索引 得到符合語法樹的文檔
lishixin/Article/program/php/201311/21308
2. php怎麼連接訪問sphinx,coreseek
修改配置文件,
建立分詞索引,
啟動sphinx的服務,
將sphinx類文件放在項目中,
引入,實例化類,
設置sphinx服務地址和埠號,
然後就可以調用query方法檢索,
以上,作為一款免費的中文分詞軟體很不錯....
3. php windows下怎麼安裝sphinx,安裝後又怎麼使用
1、下載,我這里下的是「Win64 binaries w/MySQL+PgSQL+libstemmer+id64 support」,下載後文件名:sphinx-2.0.6-release-win64-id64-full.zip;
2、將其解壓到D: \ sphinx,並在D:\sphinx下新建目錄data(用來存放索引文件)與log(用來存放日誌文件);
3、將D:\sphinx\sphinx.conf.in復制到D:\sphinx\bin\sphinx.conf.in,並重命名為sphinx.conf;
4、修改 D:\sphinx\bin\sphinx.conf 如下:
4.1、搜索source src1修改{...}中的內容
# 使用的資料庫類型
type = mysql
# 伺服器
sql_host = localhost
# 資料庫登錄名
sql_user = root
# 資料庫登錄密碼
sql_pass = root
# 操作的資料庫名稱
sql_db = test
# 資料庫伺服器埠
sql_port = 3306
# 設置編碼,如果用的是utf-8編碼
sql_query_pre = SET NAMES utf-8
(以上7條前如有#將其刪除)
4.2、搜索index test1修改{...}中的內容
# 放索引的目錄
path = D:/sphinx/data/
# 編碼
charset_type = utf-8
# 指定utf-8編碼表
charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
# 簡單分詞,只有0和1,需要搜索中文必須置1
ngram_len = 1
# 需要分詞的字元,搜索中文時必須
ngram_chars = U+3000..U+2FA1F
(以上5條前如有#將其刪除)
5、導入測試數據將D:\sphinx\example.sql中語句執行到test資料庫中,注意:test資料庫創建時需要指定為utf-8格式;
6、打開cmd窗口,進入目錄D:\sphinx\bin;
7、建立索引,執行indexer.exe test1,test1即為sphinx.conf中index test1
Sphinx 2.0.6-id64-release (r3473)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphin
using config file './sphinx.conf'...
indexing index 'test1'...
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 222 bytes
total 0.019 sec, 11252 bytes/sec, 202.74 docs/sec
total 2 reads, 0.000 sec, 0.2 kb/call avg, 0.0 msec/call avg
total 9 writes, 0.000 sec, 0.1 kb/call avg, 0.0 msec/call avg
成功...
8、搜索'test',執行search.exe test
Sphinx 2.0.6-id64-release (r3473)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file './sphinx.conf'...
index 'test1': query 'test ': returned 3 matches of 3 total in 0.000 sec
displaying matches:
1. document=1, weight=2421, group_id=1, date_added=Tue Feb 26 10:25:31 2013
id=1
group_id=1
group_id2=5
date_added=2013-02-26 10:25:31
title=test one
content=this is my test document number one. also checking search within
phrases.
2. document=2, weight=1442, group_id=3, date_added=Tue Feb 26 10:25:31 2013
id=2
group_id=3
group_id2=6
date_added=2013-02-26 10:25:31
title= ????
content=this is my test document number two ???????
3. document=4, weight=1442, group_id=2, date_added=Tue Feb 26 10:25:31 2013
id=4
group_id=2
group_id2=8
date_added=2013-02-26 10:25:31
title=doc number four
content=this is to test groups
words:
1. 'test': 3 documents, 4 hits
index 'test1stemmed': search error: failed to open D:/sphinx/data/test1stemmed.s
ph: No such file or directory.
最後面的一句error可忽略;
9、搜索中文,首先將資料庫中的內容update含有中文,執行sql語句:
UPDATE documents SET title='中文', content='this is my test document number one. also checking search within phrases.含有中文。' WHERE id=1;
UPDATE documents SET title='中文標題', content='this is my test document number one. also checking search within phrases.含有中文內容。' WHERE id=2;
UPDATE documents SET title='中文標題測試', content='this is my test document number one. also checking search within phrases.含有中文內容。' WHERE id=3;
重新建立索引(執行第7步);
然後執行search.exe 中文
Sphinx 2.0.6-id64-release (r3473)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file './sphinx.conf'...
indexing index 'test1'...
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 349 bytes
total 0.025 sec, 13808 bytes/sec, 158.26 docs/sec
total 2 reads, 0.000 sec, 0.3 kb/call avg, 0.0 msec/call avg
total 9 writes, 0.000 sec, 0.2 kb/call avg, 0.0 msec/call avg
D:\sphinx\bin>search.exe 中文
Sphinx 2.0.6-id64-release (r3473)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file './sphinx.conf'...
index 'test1': query '中文 ': returned 0 matches of 0 total in 0.000 sec
words:
index 'test1stemmed': search error: failed to open D:/sphinx/data/test1stemmed.s
ph: No such file or directory.
沒有搜索到,因為windows命令行中的中文時GBK編碼格式,所以沒有匹配內容。我們可以使用PHP程序來試試;
10、進入D:\sphinx\api\目錄,可以發現sphinx支持php、java、ruby調用,並提供對應的test例子,這里我們使用php來操作,首先將api復制到D:\www\下並重命名為sphinxapi,因為我本機上apache的web目錄為D:\www,在D:\www\sphinxapi\下新建search.php,內容為:
<?php
require 'sphinxapi.php';
$s = new SphinxClient();
$s->SetServer('localhost', 9312);
$result = $s->Query('中國');
print_r($result);
echo '<br /><br />';
$result = $s->Query('中文');
print_r($result);
?>
然後回到cmd命令行中,開啟sphinx服務,執行searchd.exe(這個必須要執行的)
Sphinx 2.0.6-id64-release (r3473)
Copyright (c) 2001-2012, Andrew Aksyonoff
Copyright (c) 2008-2012, Sphinx Technologies Inc (http://sphinxsearch.com)
using config file './sphinx.conf'...
WARNING: compat_sphinxql_magics=1 is deprecated; please update your application
and config
WARNING: preopen_indexes=1 has no effect with seamless_rotate=0
listening on all interfaces, port=9312
listening on all interfaces, port=9306
precaching index 'test1'
precaching index 'test1stemmed'
WARNING: index 'test1stemmed': preload: failed to open D:/sphinx/data/test1stemm
ed.sph: No such file or directory; NOT SERVING
precaching index 'rt'
WARNING: index 'rt': preload: failed to open @CONFDIR@/data/rt.lock: No such fil
e or directory; NOT SERVING
precached 3 indexes in 0.018 sec
成功...
然後在瀏覽器中執行http://localhost/sphinxapi/search.php,列印出來的數組結果可以很清晰的看見搜索的結果比對。。。
11、至此sphinx在windows下的簡單安裝與使用就完成了。
4. 為什麼我在普通PHP頁面用sphinx全文檢索,可以取數組的欄位,但是在ThinkPHP中只能用數字
volist是數字索引
關聯索引可以用foreach
5. think php3.2怎麼實現sphinx搜索
今天開始通過php程序使用sphinx搜索,以後做為記錄
1.啟動sphinx服務
/usr/local/coreseek/bin/searchd 其中幾個參數可以通過 -h查看
-c, -config <file> 指定coreseek中的配置文件(默認為csft.conf),位置為/usr/lcoal/coreseek/etc/中
–stop 用來停掉 searchd,使用csft.conf中所指定的PID文件,因此您可能還需要用
–config選項來確認searchd使用哪個配置文件。
值得 注意的是,調用 –stop 會確保用 UpdateAttributes() 對索引進行的更動會反應到實際的索引文件中去。示例: $ searchd –config /usr/lcoal/coreseek/etc/csft.conf –stop
–status 用來查詢運行中的searchd實例的狀態,使用指定的(也可以不指定,使用默認)配置文件中描述的連接參數。它通過配置好的第一個UNIX套接字或 TCP埠與運行中的實例連接。一旦連接成功,它就查詢一系列狀態和性能計數器的值並把這些數據列印出來。在應用程序中,可以用Status() API調用來訪問相同的這些計數器
具體可以參考:參數說明
2.php載入sphinx模塊,要想在php中使用sphinx一般有兩種方式
2.1 載入sphinx模塊
2.2 引入sphinxapi類(/home/book/Downloads/sphinx/coreseek-3.2.14/csft-3.2.14/api/目錄中) 考慮到每個使用sphinx的php文件都得引入sphinxapi類,為了方便與學習,嘗試用載入模塊的辦法。
步驟一 wget http://pecl.php.net/get/sphinx-1.1.0.tgz
步驟二 tar zxf sphinx-1.1.0.tgz cd sphinx-1.1.0 /usr/local/php/bin/phpize (生成config文件) ./configure –with-php-config=/usr/local/php/bin/php-config 提示出錯 checking for libsphinxclient headers in default path …… 找到libsphinxclient 在之前的 /home/book/Downloads/sphinx/coreseek-3.2.14/csft-3.2.14/api/目錄下 進入相關目錄安裝 ./configure make && make install 安裝完 libsphinxclient 然後繼續安裝sphinx擴展
6. PHP實現刪除多重數組對象屬性並重新賦值的方法
本文實例講述了PHP實現刪除多重數組對象屬性並重新賦值的方法。分享給大家供大家參考,具體如下:
實例:sphinx搜索出來的結果,要去掉某個屬性值:
$cl
=
new
SphinxClient
();
$query
=
$cl->Query
(
$keyword,
$index
);
方法一,直接刪除屬性:
foreach
(
$query['matches']
as
$k
=>
$val
)
{
unset($query['matches'][$k]["attrs"]["content"]);
unset($query['matches'][$k]["attrs"]["remarks"]);
}
方法二,把對應屬性值設置為空或其他需要的值:
foreach
(
$query['matches']
as
$k
=>
$val
)
{
$query['matches'][$k]["attrs"]["content"]
=
'';
$query['matches'][$k]["attrs"]["remarks"]
=
'';
}
註:要操作多重數組的關鍵是foreach循環里用
as
$k
=>
$val
取得具體元素的下標,否則無法操作。
另:php使用sphinx搜索可參考
php啟用sphinx全文搜索的實現方法
更多關於PHP相關內容感興趣的讀者可查看本站專題:《PHP數組(Array)操作技巧大全》、《php字元串(string)用法總結》、《php常用函數與技巧總結》、《PHP錯誤與異常處理方法總結》、《PHP基本語法入門教程》、《php面向對象程序設計入門教程》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
7. 電腦-Sphinx在windows下安裝使用[支持中文全文檢索]
前一陣子嘗試使用了一下Sphinx,一個能夠被各種語言(PHP/Python/Ruby/etc)方便調用的全文檢索系統。網上的資料大多是在linux環境下的安裝使用,當然,作為生產環境很有必要部署在*nix環境下,作為學習測試,還是windows環境比較方便些。
本文旨在提供一種便捷的方式讓Sphinx在windows下安裝配置以支持中文全文檢索,配置部分在linux下通用。
一、關於Sphinx
Sphinx 是一個在GPLv2 下發布的一個全文檢索引擎,商業授權(例如, 嵌入到其他程序中)需要聯系作者(Sphinxsearch.com)以獲得商業授權。
一般而言,Sphinx是一個獨立的搜索引擎,意圖為其他應用提供高速、低空間佔用、高結果相關度的全文搜索功能。Sphinx可以非常容易的與SQL資料庫和腳本語言集成。
當前系統內置MySQL和PostgreSQL 資料庫數據源的支持,也支持從標准輸入讀取特定格式的XML數據。通過修改源代碼,用戶可以自行增加新的數據源(例如:其他類型的DBMS的原生支持)。
搜索API支持PHP、Python、Perl、Rudy和Java,並且也可以用作MySQL存儲引擎。搜索API非常簡單,可以在若干個小時之內移植到新的語言上。
Sphinx特性:
高速的建立索引(在當代CPU上,峰值性能可達到10MB/秒); 高性能的搜索(在2–4GB的文本數據上,平均每次檢索響應時間小於0.1秒); 可處理海量數據(目前已知可以處理超過100GB的文本數據,在單一CPU的系統上可處理100M文檔); 提供了優秀的相關度演算法,基於短語相似度和統計(BM25)的復合Ranking方法; 支持分布式搜索; 提供文件的摘錄生成; 可作為MySQL的存儲引擎提供搜索服務; 支持布爾、短語、詞語相似度等多種檢索模式; 文檔支持多個全文檢索欄位(最大不超過32個); 文檔支持多個額外的`屬性信息(例如:分組信息,時間戳等); 停止詞查詢; 支持單一位元組編碼和UTF-8編碼; 原生的MySQL支持(同時支持MyISAM和InnoDB); 原生的PostgreSQL支持.
中文手冊可以在這里獲得(酷勤網備用下載地址:sphinx_doc_zhcn_0.9.pdf)。
二、Sphinx在windows上的安裝
1.直接在http://www.sphinxsearch.com/downloads.html找到最新的windows版本,我這里下的是Win32 release binaries with MySQL support,下載後解壓在D:sphinx目錄下;
2.在D:sphinx下新建一個data目錄用來存放索引文件,一個log目錄方日誌文件,復制D:sphinxsphinx.conf.in到D:sphinxbinsphinx.conf(注意修改文件名);
3.修改D:sphinxbinsphinx.conf,我這里列出需要修改的幾個:
type= mysql # 數據源,我這里是mysqlsql_host;= localhost # 資料庫伺服器sql_user;= root # 資料庫用戶名sql_pass;=;'' # 資料庫密碼sql_db;;;= test # 資料庫sql_port;= 3306 # 資料庫埠
sql_query_pre;;;= SET NAMES utf8 # 去掉此行前面的注釋,如果你的資料庫是uft8編碼的
index test1{#;放索引的目錄;path;;;= D:/sphinx/data/# 編碼;charset_type;;= utf-8;#; 指定utf-8的編碼表;charset_table=0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F;# 簡單分詞,只支持0和1,如果要搜索中文,請指定為1;ngram_len;;;;= 1# 需要分詞的字元,如果要搜索中文,去掉前面的注釋;ngram_chars;;;= U+3000..U+2FA1F}
# index test1stemmed : test1# {;# path;;;= @CONFDIR@/data/test1stemmed;# morphology;;= stem_en# }# 如果沒有分布式索引,注釋掉下面的內容# index dist1# {;# 'distributed' index type MUST be specified;# type;;;;= distributed
;# local index to be searched;# there can be many local indexes configured;# local;;;;= test1;# local;;;;= test1stemmed
;# remote agent;# multiple remote agents may be specified;# syntax is 'hostname:port:index1,[index2[,...]];# agent;;;;= localhost:3313:remote1;# agent;;;;= localhost:3314:remote2,remote3
;# remote agent connection timeout, milliseconds;# optional, default is 1000 ms, ie. 1 sec;# agent_connect_timeout;= 1000
;# remote agent query timeout, milliseconds;# optional, default is 3000 ms, ie. 3 sec;# agent_query_timeout;;= 3000# }
# 搜索服務需要修改的部分searchd{;# 日誌;log;;;;;= D:/sphinx/log/searchd.log
;# PID file, searchd process ID file name;pid_file;;;= D:/sphinx/log/searchd.pid
# windows下啟動searchd服務一定要注釋掉這個 # seamless_rotate;;= 1}
4.導入測試數據
C:Program FilesMySQLMySQL Server 5.0bin>mysql -uroot test<d:/sphinx/example.sql
5.建立索引
D:sphinxbin>indexer.exe test1
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file 『./sphinx.conf』…
indexing index 『test1′…
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.101 sec, 1916.30 bytes/sec, 39.72 docs/sec
D:sphinxbin>
6.搜索』test』試試
D:sphinxbin>search.exe test
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file 『./sphinx.conf』…
index 『test1′: query 『test 『: returned 3 matches of 3 total in 0.000 sec
displaying matches:
1. document=1, weight=2, group_id=1, date_added=Wed Nov 26 14:58:59 2008
;;;;;id=1
;;;;;group_id=1
;;;;;group_id2=5
;;;;;date_added=2008-11-26 14:58:59
;;;;;title=test one
;;;;;content=this is my test document number one. also checking search within
;phrases.
2. document=2, weight=2, group_id=1, date_added=Wed Nov 26 14:58:59 2008
;;;;;id=2
;;;;;group_id=1
;;;;;group_id2=6
;;;;;date_added=2008-11-26 14:58:59
;;;;;title=test two
;;;;;content=this is my test document number two
3. document=4, weight=1, group_id=2, date_added=Wed Nov 26 14:58:59 2008
;;;;;id=4
;;;;;group_id=2
;;;;;group_id2=8
;;;;;date_added=2008-11-26 14:58:59
;;;;;title=doc number four
;;;;;content=this is to test groups
words:
1. 『test』: 3 documents, 5 hits
D:sphinxbin>
都所出來了吧。
6.測試中文搜索
修改test資料庫中documents數據表,
UPDATE `test`.`documents` SET `title` = 『測試中文』, `content` = 『this is my test document number two,應該搜的到吧』 WHERE `documents`.`id` = 2;
重建索引:
D:sphinxbin>indexer.exe –all
搜索』中文』試試:
D:sphinxbin>search.exe 中文
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file 『./sphinx.conf』…
index 『test1′: query 『中文 『: returned 0 matches of 0 total in 0.000 sec
words:
D:sphinxbin>
貌似沒有搜到,這是因為windows命令行中的編碼是gbk,當然搜不出來。我們可以用程序試試,在D:sphinxapi下新建一個foo.php的文件,注意utf-8編碼
<?php
require 』sphinxapi.php』;
$s = new SphinxClient();
$s->SetServer(』localhost』,3312);
$result = $s->Query(』中文』);
var_mp($result);
?>
啟動Sphinx searchd服務
D:sphinxbin>searchd.exe
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
WARNING: forcing –console mode on Windows
using config file 『./sphinx.conf』…
creating server socket on 0.0.0.0:3312
accepting connections
執行PHP查詢:
php d:/sphinx/api/foo.php
結果是不是出來?剩下的工作就是去看手冊,慢慢摸索高階的配置。
8. 在Yii2.0 中怎麼使用 sphinx 搜索
如何調用Sphinx
按上面配置,第5節點對資料庫進行了索引,通過Sphinx自帶的search(在bin/release目錄)就可以在命令行進行搜索:
(搜索CGArt)
windows上:
search -c d:/sphinx/sphinx.conf CGArt
Linux上:
cd /usr/local/sphinx
./bin/search -c sphinx.conf CGArt
運行後,系統提示一堆信息:
....
....
words:
1. 'cgart': 36 documents, 189 hits
這個表示庫中有36條記錄符合要求,出現CGArt的有189處。應用程序如果想調用Sphinx,可以從兩個方面:
一是通過Sphinx官方提供的API介面(介面有Python,Java,Php三種版本)
二是通過安裝SphinxSE(具體見1.2部分),然後創建一個中介sphinxSE類型的表,再通過執行特定的SQL語句實現。
通過官方API調用Sphinx(以PHP為例)
在sphinx安裝目錄有一個API目錄,裡面有三個PHP文件:test.php,test2.php和sphinxapi.php。 sphinxapi.php是sphinx調用介面封裝文件,test.php是一個在命令行下執行的查詢例子文件,test2.php是一個生成摘要的 例子文件。
在命令下行運行test.php(Linux上沒有API目錄,需要從源程序包中復制api目錄至/usr/local/sphinx)
Windows上:
D:\sphinx\bin\release>c:\php5.2\php.exe -c c:\php5.2\php.ini ..\..\api\test.php -i cgfinal CGartLinux上(php在/usr/local/php目錄,sphinx.conf在/usr/local/sphinx目錄):
cd /usr/local/sphinx
/usr/local/php/bin/php api/test.php -i cgfinal CGArtSphinx的API查詢介面主要有這些內容(其實對照 一下sphinxapi.php就清楚了):
//創建Sphinx的客戶端介面對象
$cl = new SphinxClient ();
//設置連接Sphinx主機名與埠
$cl->SetServer('localhost',3312);
//可選,為每一個全文檢索欄位設置權重,主要根據你在sql_query中定義的欄位的順序,Sphinx系統以後會調整,可以按欄位名稱來設定權重
$cl->SetWeights ( array ( 100, 1 ) );
//設定搜索模式,SPH_MATCH_ALL,SPH_MATCH_ANY,SPH_MATCH_BOOLEAN,SPH_MATCH_EXTENDED,SPH_MATCH_PHRASE
$cl->SetMatchMode(SPH_MATCH_ALL);
//設定過濾條件$attribute是屬性名,相當於欄位名(用SPH_MATCH_EXTENDED時),$value是值,$exclude是布爾型,
當為true時,相當於$attribute!=$value,默認值是false
$cl->SetFilter($attribute, $values, $exclude);
//設定group by
//根據分組方法,匹配的記錄集被分流到不同的組,每個組都記錄著組的匹配記錄數以及根據當前排序方法本組中的最佳匹配記錄。
//最後的結果集包含各組的一個最佳匹配記錄,和匹配數量以及分組函數值
//結果集分組可以採用任意一個排序語句,包括文檔的屬性以及sphinx的下面幾個內部屬性
//@id--匹配文檔ID
//@weight, @rank, @relevance--匹配權重
//@group--group by 函數值
//@count--組內記錄數量
//$groupsort的默認排序方法是@group desc,就是按分組函數值大小倒序排列
$cl->SetGroupBy($attribute, $func, $groupsort);
//設定order by的內容,第一個參數是排序方法名,值有
// SPH_SORT_RELEVANCE,SPH_SORT_ATTR_DESC,SPH_SORT_ATTR_ASC,SPH_SORT_TIME_SEGMENTS,SPH_SORT_EXTENDED
//$sortby的值如"HITS desc"
$cl->SetSortMode(SPH_SORT_EXTENDED, $sortby);
//set count-distinct attribute for group-by queries,$distinct為字元串
$cl->SetGroupDistinct ( $distinct );
//相當於mysql的limit $offset,$limit
$cl->SetLimits($start,$limit)
//$q是查詢的關鍵字,$index是索引名稱,當等於*時表查詢所有索引
9. 在windows下安裝好sphinx 怎麼用php查詢查詢結果里數組內容是什麼
要配置sphinx.conf文件,把SQL語句放到那裡面,生成相應的索引,在PHP代碼裡面傳值到裡面就會出來查詢出來的結果!