Sphinx 配置及使用

 

上一篇講了Sphinx的安裝,這篇來講說怎麼用吧。php

我以我博客文章爲例,我想對我博客的內容進行全文檢索html

表名 wp_posts,字段描述以下mysql

重點在於 Sphinx.conf的配置sql

索引生成和搜索都是以這個文件爲依據,要進行全文檢索就得先把它配置好,讓Sphinx知道哪些字段須要索引,哪些字段在where ,數據庫

group,order by 中用到。api

 

   
   
   
   
  1. #源名稱 
  2. source wordpress_s 
  3.         type                    = mysql 
  4.   
  5.         sql_host                = localhost 
  6.         sql_user                = test 
  7.         sql_pass                = 111 
  8.         sql_db                  = wordpress 
  9.         sql_port                = 3306  # optional, default is 3306 
  10.         sql_query_pre           = SET NAMES UTF8 # 執行sql前要設置的字符集,(SET NAMES UTF8) 
  11.         #全文檢索要顯示的內容 , 據官方說法 : 儘量不要使用 WHERE 或 GROUPBY , 將其交給 SPHINX 效率會更高 ;select 出來的字段必須包含至少一個惟一主鍵 , 以及全文檢索的字段 
  12.         #SELECT 的字段必須至少包含一個惟一主鍵,並且這個惟一主鍵若是不是id,則須要 as 爲id,以及全文檢索的字段,在where用到的字段也要SELECT出來 
  13. #這裏我對ID,post_title,post_content,post_name,post_author進行索引 
  14.         sql_query               =  SELECT ID as id,post_title,post_content,post_name,post_author from wp_posts 
  15.   
  16.         #sql_attr* 標示屬性字段,你計劃要在where ,orderby group中用的字段要在這裏定義 
  17.         sql_attr_uint           = ID 
  18.         sql_field_string        =post_title 
  19.         sql_field_string        =post_name 
  20.         #sql_attr_timestamp     = date_added 
  21.   
  22.         sql_query_info          = SELECT * FROM wp_posts WHERE id=$id # $id 好像不能是其餘的。 
  23.   
  24.         #strip_html=0 #是否去掉HTML標籤 新版本好像已經再也不支持這個設置,它要在index索引中用html_strip代替。 
  25. #索引名稱 
  26. #index name 
  27. index wordpress_i 
  28.         source                  = wordpress_s #源名稱 
  29.         path                    = /home/admin/sphinx/var/data/wordperss #生成索引的目錄 
  30.         docinfo                 = extern 
  31.         min_prefix_len          = 0 #分詞最小前綴 
  32.         min_infix_len           = 1 #分詞最小中綴 
  33.         min_word_len            = 1     #索引的詞的最小長度 設爲 1 既能夠搜索單個字節搜索 , 越小 索引越精確 , 但創建索引花費的時間越長 
  34.         charset_type            = utf-8 #設置數據編碼爲UTF8 
  35.         charset_table           = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F 
  36.         ngram_chars             = U+3000..U+2FA1F 
  37.         ngram_len               =1 #對於非字母型數據的長度切 
  38.         html_strip              =1 #去掉HTML標籤 
  39. indexer 
  40.         mem_limit               = 32M 
  41. searchd 
  42.         listen                  = 9312 
  43.         listen                  = 9306:mysql41 
  44.         log                     = /home/admin/sphinx/var/log/searchd.log 
  45.         query_log               = /home/admin/sphinx/var/log/query.log 
  46.         read_timeout            = 5 
  47.         max_children            = 30 
  48.         pid_file                = /home/admin/sphinx/var/log/searchd.pid 
  49.         max_matches             = 1000 
  50.         seamless_rotate         = 1 
  51.         preopen_indexes         = 1 
  52.         unlink_old              = 1 
  53.         workers                 = threads # for RT to work 
  54.         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 #字符串(很明顯!),但前者僅用於檢索,然後者可做爲全文本被索引。

其結構組成主要以下 :

 

   
   
   
   
  1. Source 源名稱 1{                // 指定數據源 
  2.        一些配置 
  3. Index 索引名稱 1{ 
  4.        Source= 源名稱 1 
  5. Source 源名稱 2{ 
  6.        一些配置 
  7. Index 索引名稱 2{ 
  8.         Source= 源名稱 2 
  9. Indexer{ 
  10.         mem_limit = 32M         //索引過程當中內存使用的限制 
  11. Searchd{                             // 配置 searchd 守護程序自己 

 

Source配置項以下:

 

 

 

   
   
   
   
  1. #type 數據庫類型,目前支持mysql與pgsql  
  2.   
  3. #sql_host 數據庫主機地址  
  4.   
  5. #sql_user 數據庫用戶名  
  6.   
  7. #sql_pass 數據庫密碼  
  8.   
  9. #sql_db 數據庫名稱  
  10.   
  11. #sql_port 數據庫採用的端口  
  12.   
  13. #sql_query_pre 執行sql前要設置的字符集,用utf8必須SET NAMES utf8  
  14.   
  15. #sql_query 全文檢索要顯示的內容,在這裏儘量不使用where或group by,將where與  
  16.   
  17. groupby的內容交給sphinx,由sphinx進行條件過濾與groupby效率會更高  
  18.   
  19. #注意:select 出來的字段必須至少包括一個惟一主鍵(ARTICLESID)以及要全文檢索的  
  20.   
  21. 字段,你計劃本來在where中要用到的字段也要select出來  
  22.   
  23. #這裏不用使用orderby  
  24.  
  25.   
  26. #sql_attr_開頭的表示一些屬性字段,你原計劃要用在where,orderby,groupby中的字段要  
  27.   
  28. 在這裏定義 
  29.  

 index 索引部分以下

 

  
  
  
  
  1. source                  = wordpress_s #源名稱  
  2.   
  3. path                    = /home/admin/sphinx/var/data/wordperss #生成索引的目錄 
  4.   
  5. docinfo                 = extern 
  6.   
  7. charset_type            = utf-8 #字符集編碼 
  8.   
  9. charset_table           = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F#表示可被一元字符切分模式承認的有效字符集 
  10.   
  11. ngram_chars             = U+3000..U+2FA1F #表示要進行一元字符切分模式的字符集 
  12.   
  13. ngram_len               =1#表示使用一元字符切分模式,從而得以對單箇中文字符進行索引; 
  14.   
  15. html_strip              =1 #過濾HTML標籤 

配置好了之後,就能夠用bin/indexer來生成索引了,下面介紹一下常常用到的幾個命令。

 

  
  
  
  
  1. #更新所有索引 若是不指定-c則會默認加載sphinx.conf配置 
  2. >bin/indexer -c(--config)  /home/amdin/sphinx/etc/sphinx.conf --all 
  3.  #更新索引wordpress_i 
  4. >bin/indexer -c /home/amdin/sphinx/etc/sphinx.conf 【索引名】 
  5. #用於輪換索引,他將創建一個額外的索引,一旦創建完成,它將給searchd 發送一個信號,searchd將把原有的索引重命名*.old,將這個額外索引加載進來 
  6. >bin/indexer --config /home/myuser/sphinx.conf --all 
  7. #合併增量索引到主索引 
  8. >bin/indexer --merge main addtion_index --rotate 

怎麼來進行搜索呢?

首先啓動search服務

>bin/searchd

相應的中止命令是

>bin/searchd –stop

進行搜索嘍

> bin/search -c etc/sphinx.conf ‘斯人’

全文搜索斯人這個詞,由於個人最小分割數是1,因此斯人會拆分爲「斯」,「人」兩個字進行搜索,這樣雖然搜索效果最佳,可是創建索引的時間更長。

運行成功後會顯示一大堆信息 ,如圖

標紅是比較中重要的信息:是用的索引,搜索詞,匹配結果數,搜索時間等信息,

document 意思是在這一條數據中命中了幾回。

在PHP中的是用方法,

 

  
  
  
  
  1. require ( "sphinxapi.php" ); 
  2.   
  3. $q=$argv[1]; 
  4.   
  5. $cl=new SphinxClient(); 
  6. $cl->SetServer('localhost',9312); 
  7. $cl->SetArrayResult(true); 
  8. $cl->SetLimits(0,10); 
  9. $result=$cl->Query($q); 
  10. print_r($result); 

運行

>/home/admin/fpm-php/bin/php test.php ‘斯人’

查看結果,

可是好像有個問題,

不知道爲何沒有顯示出文本內容來,只有一些基本信息,難不成讓我拿到id號再去MYSQL取詳細數據不成??

相關文章
相關標籤/搜索