Feed on
Posts
Comments
推薦本文到Plurk噗浪去!

sphinx
最近想說幫之前替代役單位來把全文檢索的中文部份搞定,所以找了一些全文檢索的 open source,挑了這套網路上評價還不錯的 Sphinx,目前 Sphinx 支援的作業系統如下:

  • Linux 2.4.x, 2.6.x (various distributions)
  • Windows 2000, XP
  • FreeBSD 4.x, 5.x, 6.x
  • NetBSD 1.6, 3.0
  • Solaris 9, 11
  • Mac OS X

雖然上面寫 FreeBSD 只支援到 6.X,但是我測試是在 FreeBSD 7.1-RELEASE-p6 的環境,所以相當 ok 的,底下是我安裝在 FreeBSD 的心得筆記,PHP 官網上面有支援 Search Engine Extensions 的介紹,包含了 mnoGoSearchSphinx — Sphinx Client、Swish — Swish Indexing,可以利用 pecl 來安裝 Sphinx,目前版本:0.9.9-rc1。

1. FreeBSD ports 安裝:

cd /usr/ports/textproc/sphinxsearch-devel; make install clean
#
# 把 MySQL 勾選起來

2. 讓 php 支援 Sphinx 套件

#
# 先下載官方網站 Sphinx sphinx-0.9.8.1.tar.gz
wget http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz
#
# 解壓縮之後進入 sphinx/api/libsphinxclient/
./buildconf.sh && ./configure && make install

做上面步驟是確保 pecl 安裝 sphinxclient 所需要的 library sphinxclient.c 或者是 sphinxclient.h,必須放在 /usr/local/include 裡面,最後就可以用 pecl 指令安裝:

pecl install sphinx

3.接下來修改 php.ini 加入:

extension=sphinx.so

不過你也可以不用裝 sphinx client 的部份,因為官網友提供 php 的 sphinx Class 讓您使用,你打開了 sphinx.so 就會衝突重複定義。

4. 修改 /usr/local/etc/sphinx.conf 設定檔,那底下是我目前設定:

source src1
{
    type                    = mysql
    sql_host                = localhost
    sql_user                = root
    sql_pass                = xxxxxxxxxxxxxxxxx
    sql_db                  = dar
    sql_port                = 3306  # optional, default is 3306
    sql_query_pre           = SET NAMES utf8
    sql_query = \
        SELECT  rid, groupNum, itemNum, itemName, volName, collecNum \
        FROM th_series
   
    sql_ranged_throttle = 0
    sql_query_info      = SELECT * FROM  th_series WHERE rid=$id
}
source src1throttled : src1
{
    sql_ranged_throttle         = 100
}
index test1
{
    source          = src1
    path            = /var/db/sphinxsearch/data/test1
    docinfo         = extern
    mlock           = 0
    morphology      = none
    min_word_len        = 1
    charset_type        = utf-8
    min_infix_len       = 1
    ngram_len               = 1
    html_strip              = 0
}
index dist1
{
    type                = distributed
    local               = test1
    local               = test1stemmed
    agent               = localhost:3313:remote1
    agent               = localhost:3314:remote2,remote3
    agent_connect_timeout   = 1000
    agent_query_timeout     = 3000
}
indexer
{
    mem_limit           = 256M
}
searchd
{
    listen              = 0.0.0.0
    listen              = 3312
    log                 = /var/log/searchd.log
    query_log           = /var/log/sphinx-query.log
    read_timeout        = 5
    client_timeout      = 300
    max_children        = 300
    pid_file            = /var/run/sphinxsearch/searchd.pid
    max_matches         = 10000
}

注意:charset_type 必須改為 utf-8,然後必須加上 charset_table 跟 ngram_chars 這樣中文檢索就沒有問題了,可以參考 ihower 這篇:全文搜尋 Sphinx on Rails,官方討論區有人問過:full-text searching in Chinese document. 此篇務必看過,對中文搜尋有很大的幫助。

5. 建立索引:

#
# 針對 test1 索引
/usr/local/bin/indexer test1
#
# 全部索引
/usr/local/bin/indexer --all

6. 查詢:

#
# -i 針對 test1 索引搜尋,-l 1 顯示一筆資料
search -i test1 -l 1 "臺灣"

sphinx_search (by appleboy46)
7. 架設 sphinx 伺服器:

#
# 建立 4567 port 索引伺服器
searchd --console --nodetach --port 4567 -i test1

listen 0.0.0.0 跟 port 4567,提供 php 做查詢動作。

詳細更多設定可以參考 Sphinx 0.9.9 reference manual 或者是中文:sphinx search中文

推薦本文到Plurk噗浪去!
  • Pingback: 網站製作學習誌 » [Web] 連結分享

  • Pingback: [教學] 加入 Sphinx 繁體中文全文檢索 on CodeIgniter | 小惡魔 - 電腦技術 - 生活日記 - 美食介紹 - AppleBOY

  • Johnny

    不好意思
    請問一下 FreeBSD Sphinx 繁體中文檢索
    與Lucene 的功能一樣嗎?
    謝謝!!!

  • http://blog.wu-boy.com appleboy

    我沒有使用過 Lucene,所以這部份沒辦法回答你,不好意思

  • Johnny

    不好意思
    那請問FreeBSD Sphinx 程式碼的功能可以當成搜尋引擎的功能來用嗎?
    謝謝!!!

  • Johnny

    不好意思
    請問一下 FreeBSD Sphinx 繁體中文檢索 程式碼的功能 可以用在網站上的搜尋引擎功能嗎?
    謝謝!!!

  • http://blog.wu-boy.com appleboy

    可以的阿,那沒有問題喔,他有提供多種程式的 api。

  • Johnny

    不好意思
    請問一下 FreeBSD Sphinx 繁體中文檢索 程式的API
    可以套用到JSP裡面嗎?

    謝謝!!!

  • http://blog.wu-boy.com appleboy
  • http://jayclub.no-ip.org jay

    您好:
    想請教幾個問題:
    1.此軟體是否可以搜尋整個HD內的檔案(doc,odf….等),是否需要先建立DB?
    2.小弟照您的說明去設定最後執行的時候會出現類似這樣的訊息:
    using config file ‘/usr/local/etc/sphinx.conf’…
    indexing index ‘test1′…
    FATAL: failed to open /var/data/test1.spl: No such file or directory, will not index. Try –rotate option.
    不知道是哪裡出錯,小弟想結合網頁搜尋Server的文件,可否請前指點一下.
    3.我參考官網與您的說終於於安裝起來,不過看起來很大,看起來我漏掉很多,可否請前輩指點,小弟使用CentOS5.2

  • http://huee11.blogspot.com ploglin

    jay 的問題應該是因為你的 searchd 已經 run 起來了,官方的說明寫如果要動態更新 index 的話要多下一個 -rotate 的參數。

    所以只要下indexer test1 –rotate 就可以順利更新 index

  • ccg

    您好,有二個問題想請教:
    1. 搜尋一個名詞時,比如說「斯芬克斯」時,sphinx會拆成「斯」、「芬」、「克」這三個字來列舉結果。是否有辦法能強制sphinx以「斯芬克斯」為單一關鍵字來查尋?

    2. 承上,如果有辦法能強制sphinx以「斯芬克斯」為單一關鍵字來查尋的話,假設有一文章裡的內容如下:
    斯芬克斯
    「斯芬克斯」一詞的中間被page這個tag所截斷,那就查不到了(這是假設1.是可以辦到的情形之下)。是否有辦法把page這個標籤忽略掉?