上一篇講了Sphinx的安裝,這篇來講說怎麼用吧。php
我以我博客文章爲例,我想對我博客的內容進行全文檢索html
表名 wp_posts,字段描述以下mysql
重點在於 Sphinx.conf的配置sql
索引生成和搜索都是以這個文件爲依據,要進行全文檢索就得先把它配置好,讓Sphinx知道哪些字段須要索引,哪些字段在where ,數據庫
group,order by 中用到。api
- #源名稱
- source wordpress_s
- {
- type = mysql
- sql_host = localhost
- sql_user = test
- sql_pass = 111
- sql_db = wordpress
- sql_port = 3306 # optional, default is 3306
- sql_query_pre = SET NAMES UTF8 # 執行sql前要設置的字符集,(SET NAMES UTF8)
- #全文檢索要顯示的內容 , 據官方說法 : 儘量不要使用 WHERE 或 GROUPBY , 將其交給 SPHINX 效率會更高 ;select 出來的字段必須包含至少一個惟一主鍵 , 以及全文檢索的字段
- #SELECT 的字段必須至少包含一個惟一主鍵,並且這個惟一主鍵若是不是id,則須要 as 爲id,以及全文檢索的字段,在where用到的字段也要SELECT出來
- #這裏我對ID,post_title,post_content,post_name,post_author進行索引
- sql_query = SELECT ID as id,post_title,post_content,post_name,post_author from wp_posts
- #sql_attr* 標示屬性字段,你計劃要在where ,orderby group中用的字段要在這裏定義
- sql_attr_uint = ID
- sql_field_string =post_title
- sql_field_string =post_name
- #sql_attr_timestamp = date_added
- sql_query_info = SELECT * FROM wp_posts WHERE id=$id # $id 好像不能是其餘的。
- #strip_html=0 #是否去掉HTML標籤 新版本好像已經再也不支持這個設置,它要在index索引中用html_strip代替。
- }
- #索引名稱
- #index name
- index wordpress_i
- {
- source = wordpress_s #源名稱
- path = /home/admin/sphinx/var/data/wordperss #生成索引的目錄
- docinfo = extern
- min_prefix_len = 0 #分詞最小前綴
- min_infix_len = 1 #分詞最小中綴
- min_word_len = 1 #索引的詞的最小長度 設爲 1 既能夠搜索單個字節搜索 , 越小 索引越精確 , 但創建索引花費的時間越長
- charset_type = utf-8 #設置數據編碼爲UTF8
- charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
- ngram_chars = U+3000..U+2FA1F
- ngram_len =1 #對於非字母型數據的長度切
- html_strip =1 #去掉HTML標籤
- }
- indexer
- {
- mem_limit = 32M
- }
- searchd
- {
- listen = 9312
- listen = 9306:mysql41
- log = /home/admin/sphinx/var/log/searchd.log
- query_log = /home/admin/sphinx/var/log/query.log
- read_timeout = 5
- max_children = 30
- pid_file = /home/admin/sphinx/var/log/searchd.pid
- max_matches = 1000
- seamless_rotate = 1
- preopen_indexes = 1
- unlink_old = 1
- workers = threads # for RT to work
- binlog_path = /home/admin/sphinx/var/data
- }
Sphinx支持幾個屬性類型less
sql_attr_uint 和 sql_attr_bigintide
# 32 位無符號整數值和 64 位有符號整數值。可對全部整數數據庫字段和 DATE 使用這兩種類型。wordpress
sql_attr_float #32 位浮點值。若是您想要存儲地理座標,可以使用此屬性類型。還要注意的是,若是您須要更高的精確度,則沒有解決函數
方法;字段四捨五入到七位小數。
sql_attr_bool #一個布爾型(單個位)值,相似於 MySQL 的 tinyint 值。
sql_attr_timestamp #一種 UNIX 時間戳,可表示從 1970-01-01 到 2038-01-19 的日期/時間值。您在 Sphinx 中沒法直
接使用 DATE 或 DATETIME 列類型。您必須使用 UNIX_TIMESTAMP() 函數將它們轉換爲時間戳。若是您僅須要日期,可以使用
TO_DAYS() 函數將 DATE 字段轉換爲一個整數。
sql_attr_string 和 sql_field_string #字符串(很明顯!),但前者僅用於檢索,然後者可做爲全文本被索引。
其結構組成主要以下 :
- Source 源名稱 1{ // 指定數據源
- 一些配置
- }
- Index 索引名稱 1{
- Source= 源名稱 1
- }
- Source 源名稱 2{
- 一些配置
- }
- Index 索引名稱 2{
- Source= 源名稱 2
- }
- Indexer{
- mem_limit = 32M //索引過程當中內存使用的限制
- }
- Searchd{ // 配置 searchd 守護程序自己
- }
Source配置項以下:
- #type 數據庫類型,目前支持mysql與pgsql
- #sql_host 數據庫主機地址
- #sql_user 數據庫用戶名
- #sql_pass 數據庫密碼
- #sql_db 數據庫名稱
- #sql_port 數據庫採用的端口
- #sql_query_pre 執行sql前要設置的字符集,用utf8必須SET NAMES utf8
- #sql_query 全文檢索要顯示的內容,在這裏儘量不使用where或group by,將where與
- groupby的內容交給sphinx,由sphinx進行條件過濾與groupby效率會更高
- #注意:select 出來的字段必須至少包括一個惟一主鍵(ARTICLESID)以及要全文檢索的
- 字段,你計劃本來在where中要用到的字段也要select出來
- #這裏不用使用orderby
- #sql_attr_開頭的表示一些屬性字段,你原計劃要用在where,orderby,groupby中的字段要
- 在這裏定義
index 索引部分以下
- source = wordpress_s #源名稱
- path = /home/admin/sphinx/var/data/wordperss #生成索引的目錄
- docinfo = extern
- charset_type = utf-8 #字符集編碼
- charset_table = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F#表示可被一元字符切分模式承認的有效字符集
- ngram_chars = U+3000..U+2FA1F #表示要進行一元字符切分模式的字符集
- ngram_len =1#表示使用一元字符切分模式,從而得以對單箇中文字符進行索引;
- html_strip =1 #過濾HTML標籤
配置好了之後,就能夠用bin/indexer來生成索引了,下面介紹一下常常用到的幾個命令。
- #更新所有索引 若是不指定-c則會默認加載sphinx.conf配置
- >bin/indexer -c(--config) /home/amdin/sphinx/etc/sphinx.conf --all
- #更新索引wordpress_i
- >bin/indexer -c /home/amdin/sphinx/etc/sphinx.conf 【索引名】
- #用於輪換索引,他將創建一個額外的索引,一旦創建完成,它將給searchd 發送一個信號,searchd將把原有的索引重命名*.old,將這個額外索引加載進來
- >bin/indexer --config /home/myuser/sphinx.conf --all
- #合併增量索引到主索引
- >bin/indexer --merge main addtion_index --rotate
怎麼來進行搜索呢?
首先啓動search服務
>bin/searchd
相應的中止命令是
>bin/searchd –stop
進行搜索嘍
> bin/search -c etc/sphinx.conf ‘斯人’
全文搜索斯人這個詞,由於個人最小分割數是1,因此斯人會拆分爲「斯」,「人」兩個字進行搜索,這樣雖然搜索效果最佳,可是創建索引的時間更長。
運行成功後會顯示一大堆信息 ,如圖
標紅是比較中重要的信息:是用的索引,搜索詞,匹配結果數,搜索時間等信息,
document 意思是在這一條數據中命中了幾回。
在PHP中的是用方法,
- require ( "sphinxapi.php" );
- $q=$argv[1];
- $cl=new SphinxClient();
- $cl->SetServer('localhost',9312);
- $cl->SetArrayResult(true);
- $cl->SetLimits(0,10);
- $result=$cl->Query($q);
- print_r($result);
運行
>/home/admin/fpm-php/bin/php test.php ‘斯人’
查看結果,
可是好像有個問題,
不知道爲何沒有顯示出文本內容來,只有一些基本信息,難不成讓我拿到id號再去MYSQL取詳細數據不成??