2010年3月26日 星期五

sphinx for freebsd 完整安裝流程 (4)

接下來,為了要讓 sphinx 可以支援中文欄位的精確搜尋,我們要使用之前文章所安裝好的 sphinxse,首先我們先將我們要索引的資料放進資料庫,別忘了要有一個 id 的欄位,接下來設定 sphinx.conf 的檔案內容。
#
# Minimal Sphinx configuration sample (clean, simple, functional)
#
source src_ticket
{
    type                  = mysql          # 資料庫類型
    sql_host              = localhost      # 資料庫位置
    sql_user              = user           # 資料庫使用者
    sql_pass              = pass           # 資料庫密碼
    sql_db                = test           # 資料庫名稱
    sql_port              = 3306           # optional, default is 3306
    sql_query_pre         = set names utf8 # Query 前會先執行的語法
    sql_query             = \              # Query Index 資料
        SELECT  id, serial, category, enable, retail_price, progname, lastmodified \
        FROM test_table
    sql_attr_uint         = retail_price   # 檢索時不會檢索此欄位,可用於 filter, sort
    sql_attr_timestamp    = lastmodified   # 檢索時不會檢索此欄位,可用於 filter, sort
    sql_query_info        = SELECT item,progname FROM test_table WHERE id=$id # 使用內建 search 程序,自動取得完整資料的語法
}
index ix_ticket
{
    source                = src_ticket                           # source 的名稱
    path                  = /usr/local/sphinx/var/data/ix_ticket # index放置的路徑以及索引名稱的前置詞
    docinfo               = extern
    charset_type          = utf-8                                # 編碼
    chinese_dictionary    = /usr/local/sphinx/etc/xdict          # 分詞檔完整路徑
}
indexer
{
    mem_limit             = 256M
}
searchd
{
    port                  = 9312
    log                   = /usr/local/sphinx/var/log/searchd.log
    query_log             = /usr/local/sphinx/var/log/query.log
    read_timeout          = 5
    max_children          = 30
    pid_file              = /usr/local/sphinx/var/log/searchd.pid
    max_matches           = 1000
    seamless_rotate       = 1
    preopen_indexes       = 0
    unlink_old            = 1
}
依照 config 建立 index
# 建立索引
/usr/local/sphinx/bin/indexer --all
# 輸出結果
Sphinx 0.9.9-release (r2117)
Copyright (c) 2001-2009, Andrew Aksyonoff

using config file '/usr/local/sphinx/etc/sphinx.conf'...
indexing index 'ix_ticket'...
collected 3694 docs, 0.2 MB
sorted 0.0 Mhits, 100.0% done
total 3694 docs, 199207 bytes
total 0.060 sec, 3292242 bytes/sec, 61049.77 docs/sec
total 2 reads, 0.000 sec, 150.1 kb/call avg, 0.4 msec/call avg
total 7 writes, 0.002 sec, 106.9 kb/call avg, 0.3 msec/call avg
# 啟動 searchd
/usr/local/sphinx/bin/searchd
當啟動 searchd 之後,我們就可以在資料庫建用 sphinxse ,語法如下
-- 建立時,資料庫主機會即時連線 localhost:9312 是否正常
-- ix_ticket 為 index 的名稱,table name 可以隨便取,但在 localhost:9312 後面的 index name 一定要對應到 sphinx.conf 的設定
CREATE TABLE ix_ticket
(
    id          INTEGER UNSIGNED NOT NULL,
    weight      INTEGER NOT NULL,
    query       VARCHAR(3072) NOT NULL,
    group_id    INTEGER,
    INDEX(query)
) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/ix_ticket";
建立好,我們就可以來試試是否運作正常,下面是我測試的範例
<?php
// 文字比較好 debug
header("Content-type: text/plain; charset=utf-8;");
// 設定 get 值,並判斷是否為 utf-8 的型態
$q = $_GET['q'];
$q = (!mb_check_encoding($q,"UTF-8")) ? iconv('cp950', 'utf-8', $q) : $q;
// 數據庫連線
$connection = mysql_connect('localhost', 'user', 'name');
mysql_select_db('test', $connection);
mysql_query("set names utf8", $connection);
/**
 * 這邊是欄位搜尋的範例
 * 檢查 progname 的欄位是否有此關鍵字
 **/
$sql = "select * from t1, test_table m1 where t1.id=m1.id and query = '@progname $q; mode=extended'";
echo "\n";
echo "SQL: ".$sql."\n";
echo "\n";
$rlt = mysql_query($sql, $connection);
while($row = mysql_fetch_assoc($rlt))
{
    echo $row['id']."\t";
    echo $row['serial']."\t";
    echo $row['progname']."\t";
    echo $row['retail_price']."\n";
}
mysql_free_result($rlt);
?>
測試結束,接下來就要開始試試資料庫有 300 萬筆時,是否會影響到搜尋的效能

沒有留言: