基本實踐
<?php
// 引入
require_once './sdk/xs/lib/XS.php';
// 創建對象
$xs = new XS('demo');
// 查詢
$docs = $xs->search->search('測試');
// 輸出
print_r($docs);
異常捕獲
try
{
$xs = new XS('demo');
$docs = $xs->search->setQuery('測試')->setLimit(5)->search();
foreach ($docs as $doc)
{
echo $doc->rank() . ". " . $doc->subject . " [" . $doc->percent() . "%]\n";
echo $doc->message . "\n";
}
}
catch (XSException $e)
{
echo $e; // 直接輸出異常描述
if (defined('DEBUG')) // 如果是 DEBUG 模式,則輸出堆棧情況
echo "\n" . $e->getTraceAsString() . "\n";
}
XSDocument 文檔
docid() 取得搜索結果文檔的 docid 值 (實際數據庫內的 id,一般用不到)
rank() 取得搜索結果文檔的序號值 (第X條結果)
percent() 取得搜索結果文檔的匹配百分比 (結果匹配度, 1~100)
weight() 取得搜索結果文檔的權重值 (浮點數)
ccount() 取得搜索結果折疊的數量 (按字段折疊搜索時才有效)
添加操作
<?php
// 引入
require_once './sdk/xs/lib/XS.php';
try
{
$xs = new XS('demo');
$doc = new XSDocument();
$doc->pid = 4;
$doc->subject = "Hello,XS";
$doc->message = "Hello,XS內容";
$xs->index->add($doc);
}
catch (XSException $e)
{
echo $e; // 直接輸出異常描述
if (defined('DEBUG')) // 如果是 DEBUG 模式,則輸出堆棧情況
echo "\n" . $e->getTraceAsString() . "\n";
}
<?php
// 引入
require_once './sdk/xs/lib/XS.php';
try
{
$xs = new XS('demo');
$doc = new XSDocument();
$doc['pid'] = 5;
$doc['subject'] = "Hello,XS";
$doc['message'] = "Hello,XS內容";
$xs->index->add($doc);
}
catch (XSException $e)
{
echo $e; // 直接輸出異常描述
if (defined('DEBUG')) // 如果是 DEBUG 模式,則輸出堆棧情況
echo "\n" . $e->getTraceAsString() . "\n";
}
<?php
// 引入
require_once './sdk/xs/lib/XS.php';
try
{
$xs = new XS('demo');
$doc = new XSDocument();
$doc ->setFields([
'pid' => 6,
'subject' => "Hello,XS",
'message' => "Hello,XS內容"
]);
$xs->index->add($doc);
}
catch (XSException $e)
{
echo $e; // 直接輸出異常描述
if (defined('DEBUG')) // 如果是 DEBUG 模式,則輸出堆棧情況
echo "\n" . $e->getTraceAsString() . "\n";
}
建立索引的過程會有點延遲!
$index->add($doc)->flushIndex()
可以臨時處理成同步的。
ini
string 字符型,適用多數情況,也是默認值
numeric 數值型,包含整型和浮點數,僅當字段需用於以排序或區間檢索時才設為該類型,否則請使用 string 即可
date 日期型,形式為 YYYYmmdd 這樣固定的 8 字節,如果沒有區間檢索或排序需求不建議使用
id 主鍵型,確保每條數據具備唯一值,是索引更新和刪除的憑據,每個搜索項目必須有且僅有一個 id 字段,該字段的值不區分大小寫
title 標題型,標題或名稱字段,至多有一個該類型的字段
body 內容型,主內容字段, 即本搜索項目中內容最長的字段,至多只有一個該類型字段,本字段不支持字段檢索
type = string
project.name = sample
project.default_charset = GBK
;server.index = 8383
;server.search = 8384
[pid]
type = id
[subject]
type = title
[message]
type = body
[dateline]
type = numeric
[author]
index = both
[authorid]
[tid]
index = self
tokenizer = full
[fid]
index = self
tokenizer = full
[flag]
更新、修改文檔
如果索引數據庫中已存在主鍵值相同的文檔,那么相當於先刪除原有的文檔,再用當前文檔替換它。 如果未存在主鍵值相同的文檔,則效果和添加文檔完全一致。
<?php
// 引入
require_once './sdk/xs/lib/XS.php';
$xs = new XS('my');
$data = array(
'pid' => 2, // 此字段為主鍵,是進行文檔替換的唯一標識
'subject' => '測試文檔的標題',
'message' => '測試文檔的內容部分',
'chrono' => time()
);
// 創建文檔對象
$doc = new XSDocument;
$doc->setFields($data);
// 更新到索引數據庫中
$xs->index->update($doc)->flushIndex();
刪除文檔
1.按主鍵刪除
<?php
// 引入
require_once './sdk/xs/lib/XS.php';
// 創建xs
$xs = new XS('my');
// 創建index
$index = $xs->index;
// 刪除
$index->del('1')->flushIndex();
// 刪除
$index->del(['4','5'])->flushIndex();
2.按內容刪除
<?php
// 引入
require_once './sdk/xs/lib/XS.php';
$xs = new XS('my');
// 創建xs
$xs = new XS('my');
// 創建index
$index = $xs->index;
// 刪除
$index->del('測試','subject')->flushIndex();
此外刪除操作和添加文檔一樣,也是一個異步行為。
清空索引
// 創建xs
$xs = new XS('my');
// 創建index
$index = $xs->index;
// 刪除
$index->clean();
平滑重建索引
<?php
// 引入
require_once './sdk/xs/lib/XS.php';
// 創建xs
$xs = new XS('my');
// 創建index
$index = $xs->index;
// 宣布開始重建索引
$index->beginRebuild();
// 然后在此開始添加數據
$data = array(
'pid' => 2, // 此字段為主鍵,是進行文檔替換的唯一標識
'subject' => '測試文檔的標題',
'message' => '測試文檔的內容部分',
'chrono' => time()
);
// 創建文檔對象
$doc = new XSDocument;
$doc->setFields($data);
$index->add($doc);
// 告訴服務器重建完比
$index->endRebuild();
使用索引緩沖區
一次性提交服務操作
<?php
// 引入
require_once './sdk/xs/lib/XS.php';
// 創建xs
$xs = new XS('my');
// 創建index
$index = $xs->index;
// 開啟緩沖區,默認 4MB,如 $index->openBuffer(8) 則表示 8MB
$index->openBuffer();
// 然后在此開始添加數據
$data = array(
'pid' => 2, // 此字段為主鍵,是進行文檔替換的唯一標識
'subject' => '測試文檔的標題',
'message' => '測試文檔的內容部分',
'chrono' => time()
);
// 創建文檔對象
$doc = new XSDocument;
$doc->setFields($data);
// 在此進行批量的文檔添加、修改、刪除操作
$index->add($doc);
$index->add($doc);
$index->add($doc);
$index->add($doc);
$index->add($doc);
$index->add($doc);
$index->closeBuffer(); // 關閉緩沖區,必須和 openBuffer 成對使用
自定義 SCWS 詞庫
1.全局自定義詞庫
$prefix/etc/dict_user.txt
# Custom dictionary for scws (UTF-8 encoding)
# 每行一條記錄,以 # 開頭的號表示注釋忽略
# 每行最多包含 4 個字段,依次代表 "詞條" "TF" "IDF" "詞性"
# 字段之間用空格或制表符分開,特殊詞性 "!" 用於表示刪除該詞
# 參見 scws 自定義詞典幫助:
# http://bbs.xunsearch.com/showthread.php?tid=1303
# $Id$
#
# WORD TF IDF ATTR
# ------------------------------------------------------
2.項目自定義詞庫(這個貌似更好的讀取)
$prefix/data/項目名稱/dict_user.txt
