XSSearch

XS
繼承關系 class XSSearch » XSServer » XSComponent
版本 1.0.0
源代碼 sdk/php/lib/XSSearch.class.php
XS 搜索類, 執行搜索功能 有部分方法支持串接操作
$xs->search->setQuery($str)->setLimit(10, 10)->search();
$xs->close();

Public 屬性

隱去繼承來的屬性

名稱類型描述定義于
allSynonyms array 獲取當前庫內的全部同義詞列表 XSSearch
connString string 連接字符串 XSServer
correctedQuery array 獲取修正后的搜索詞列表 XSSearch
dbTotal int 獲取搜索數據庫內的數據總量 XSSearch
facets array 讀取最近一次分面搜索記數 XSSearch
hotQuery array 獲取熱門搜索詞列表 XSSearch
lastCount int 獲取最近那次搜索的匹配總數估值 XSSearch
project string 獲取當前項目名稱 XSServer
query string 獲取解析后的搜索語句 XSSearch
relatedQuery array 獲取相關搜索詞列表 XSSearch
respond XSCommand 從服務器讀取響應指令 XSServer
socket mixed 獲取連接資源描述符 XSServer
xs XS 服務端關聯的 XS 對象 XSServer

Protected 屬性

隱去繼承來的屬性

名稱類型描述定義于
_conn XSServer
_flag XSServer
_project XSServer
_sendBuffer XSServer
_sock XSServer

Public 方法

隱去繼承來的方法

名稱描述定義于
__construct() 構造函數, 打開連接 XSServer
__destruct() 析構函數, 關閉連接 XSServer
__get() 魔術方法 __get XSComponent
__isset() 魔術方法 __isset XSComponent
__set() 魔術方法 __set XSComponent
__unset() 魔術方法 __unset XSComponent
addDb() 添加搜索的數據庫名, 支持多庫同時搜索 XSSearch
addQueryString() 增加默認搜索語句 XSSearch
addQueryTerm() 增加默認搜索詞匯 XSSearch
addRange() 添加搜索過濾區間或范圍 XSSearch
addSearchLog() 添加搜索日志關鍵詞到緩沖區里 XSSearch
addWeight() 添加權重索引詞 XSSearch
close() 關閉連接 XSServer
count() 估算搜索語句的匹配數據量 XSSearch
execCommand() 執行服務端指令并獲取返回值 XSServer
getAllSynonyms() 獲取當前庫內的全部同義詞列表 XSSearch
getConnString() Returns 連接字符串 XSServer
getCorrectedQuery() 獲取修正后的搜索詞列表 XSSearch
getDbTotal() 獲取搜索數據庫內的數據總量 XSSearch
getExpandedQuery() 獲取展開的搜索詞列表 XSSearch
getFacets() 讀取最近一次分面搜索記數 XSSearch
getHotQuery() 獲取熱門搜索詞列表 XSSearch
getLastCount() 獲取最近那次搜索的匹配總數估值 XSSearch
getProject() 獲取當前項目名稱 XSServer
getQuery() 獲取解析后的搜索語句 XSSearch
getRelatedQuery() 獲取相關搜索詞列表 XSSearch
getRespond() 從服務器讀取響應指令 XSServer
getSocket() 獲取連接資源描述符 XSServer
getSynonyms() 獲取指定詞匯的同義詞列表 XSSearch
hasRespond() 判斷服務端是否有可讀數據 XSServer
highlight() 搜索結果字符串高亮處理 XSSearch
markResetScheme() 標記字段方案重置 XSSearch
open() 連接搜索服務端并初始化 XSSearch
reopen() 重新打開連接 XSServer
sendCommand() 往服務器直接發送指令 (無緩存) XSServer
setAutoSynonyms() 開啟自動同義詞搜索功能 XSSearch
setCharset() 設置字符集 XSSearch
setCollapse() 設置折疊搜索結果 XSSearch
setCutOff() 設置百分比/權重剔除參數 XSSearch
setDb() 設置要搜索的數據庫名 XSSearch
setDocOrder() 設置結果按索引入庫先后排序 XSSearch
setFacets() 設置分面搜索記數 XSSearch
setFuzzy() 開啟模糊搜索 XSSearch
setGeodistSort() 設置地理位置距離排序方式 XSSearch
setLimit() 設置搜索結果的數量和偏移 XSSearch
setMultiSort() 設置多字段組合排序方式 XSSearch
setProject() 設置當前項目 XSServer
setQuery() 設置默認搜索語句 XSSearch
setRequireMatchedTerm() 設置在搜索結果文檔中返回匹配詞表 XSSearch
setScwsMulti() 設置當前搜索語句的分詞復合等級 XSSearch
setSort() 設置搜索結果的排序方式 XSSearch
setSynonymScale() 設置同義詞搜索的權重比例 XSSearch
setTimeout() 設置服務端超時秒數 XSServer
setWeightingScheme() 設置檢索匹配的權重方案 XSSearch
terms() 獲取搜索語句中的高亮詞條列表 XSSearch

Protected 方法

隱去繼承來的方法

名稱描述定義于
check() 檢測服務端的連接情況 XSServer
connect() 連接服務端 XSServer
read() 讀取數據 XSServer
write() 寫入數據 XSServer

屬性明細

allSynonyms 屬性 只讀 (自版本 v1.3.0 起可用)
public array getAllSynonyms(int $limit=0, int $offset=0, bool $stemmed=false)

獲取當前庫內的全部同義詞列表

correctedQuery 屬性 只讀
public array getCorrectedQuery(string $query=NULL)

獲取修正后的搜索詞列表 通常當某次檢索結果數量偏少時, 可以用該函數設計 "你是不是要找: ..." 功能

dbTotal 屬性 只讀
public int getDbTotal()

獲取搜索數據庫內的數據總量

facets 屬性 (自版本 v1.1.0 起可用)
public array getFacets(string $field=NULL)
public XSSearch setFacets(mixed $field, bool $exact=false)

讀取最近一次分面搜索記數 必須在某一次 search 之后調用本函數才有意義

hotQuery 屬性 只讀
public array getHotQuery(int $limit=6, string $type='total')

獲取熱門搜索詞列表

lastCount 屬性 只讀
public int getLastCount()

獲取最近那次搜索的匹配總數估值

參見

query 屬性
public string getQuery(string $query=NULL)
public XSSearch setQuery(string $query)

獲取解析后的搜索語句

relatedQuery 屬性 只讀
public array getRelatedQuery(string $query=NULL, int $limit=6)

獲取相關搜索詞列表

方法明細

addDb() 方法
public XSSearch addDb(string $name)
$name string
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L555 (顯示)
public function addDb($name)
{
    
$name strval($name);
    
$this->execCommand(array('cmd' => XS_CMD_SEARCH_ADD_DB'buf' => $name));
    
$this->_curDbs[] = $name;
    return 
$this;
}

添加搜索的數據庫名, 支持多庫同時搜索

參見

addQueryString() 方法
public string addQueryString(string $query, int $addOp=0, float $scale=1)
$query string 搜索語句
$addOp int 與舊語句的結合操作符, 如果無舊語句或為空則這此無意義, 支持的操作符有: XS_CMD_QUERY_OP_AND XS_CMD_QUERY_OP_OR XS_CMD_QUERY_OP_AND_NOT XS_CMD_QUERY_OP_XOR XS_CMD_QUERY_OP_AND_MAYBE XS_CMD_QUERY_OP_FILTER
$scale float 權重計算縮放比例, 默認為 1表示不縮放, 其它值范圍 0.xx ~ 655.35
{return} string 修正后的搜索語句
源碼: sdk/php/lib/XSSearch.class.php#L1012 (顯示)
public function addQueryString($query$addOp XS_CMD_QUERY_OP_AND$scale 1)
{
    
$query $this->preQueryString($query);
    
$bscale = ($scale && $scale != 1) ? pack('n'intval($scale 100)) : '';

    
$cmd = new XSCommand(XS_CMD_QUERY_PARSE$addOp$this->_defaultOp$query$bscale);
    
$this->execCommand($cmd);
    return 
$query;
}

增加默認搜索語句

addQueryTerm() 方法
public XSSearch addQueryTerm(string $field, string|array $term, int $addOp=0, float $scale=1)
$field string 索引詞所屬的字段, 若為混合區詞匯可設為 null 或 body 型的字段名
$term string|array 索引詞或列表
$addOp int 與舊語句的結合操作符, 如果無舊語句或為空則這此無意義, 支持的操作符有:
$scale float 權重計算縮放比例, 默認為 1表示不縮放, 其它值范圍 0.xx ~ 655.35
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L1033 (顯示)
public function addQueryTerm($field$term$addOp XS_CMD_QUERY_OP_AND$scale 1)
{
    
$term XS::convert($term'UTF-8'$this->_charset);
    
$bscale = ($scale && $scale != 1) ? pack('n'intval($scale 100)) : '';
    
$vno $field === null XSFieldScheme::MIXED_VNO $this->xs->getField($fieldtrue)->vno;
    
$cmd XS_CMD_QUERY_TERM;
    if (
is_array($term)) {
        if (
count($term) === 0) {
            return 
$this;
        } elseif (
count($term) === 1) {
            
$term current($term);
        } else {
            
$term implode("\t"$term);
            
$cmd XS_CMD_QUERY_TERMS;
        }
    }
    
$cmd = new XSCommand($cmd$addOp$vno$term$bscale);
    
$this->execCommand($cmd);
    return 
$this;
}

增加默認搜索詞匯

參見

addRange() 方法
public XSSearch addRange(string $field, mixed $from, mixed $to)
$field string
$from mixed 起始值(不包含), 若設為 null 則相當于匹配 <= to (字典順序)
$to mixed 結束值(包含), 若設為 null 則相當于匹配 >= from (字典順序)
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L410 (顯示)
public function addRange($field$from$to)
{
    if (
$from === '' || $from === false) {
        
$from null;
    }
    if (
$to === '' || $to === false) {
        
$to null;
    }
    if (
$from !== null || $to !== null) {
        if (
strlen($from) > 255 || strlen($to) > 255) {
            throw new 
XSException('Value of range is too long');
        }

        
$vno $this->xs->getField($field)->vno;
        
$from XS::convert($from'UTF-8'$this->_charset);
        
$to XS::convert($to'UTF-8'$this->_charset);
        if (
$from === null) {
            
$cmd = new XSCommand(XS_CMD_QUERY_VALCMPXS_CMD_QUERY_OP_FILTER$vno$tochr(XS_CMD_VALCMP_LE));
        } elseif (
$to === null) {
            
$cmd = new XSCommand(XS_CMD_QUERY_VALCMPXS_CMD_QUERY_OP_FILTER$vno$fromchr(XS_CMD_VALCMP_GE));
        } else {
            
$cmd = new XSCommand(XS_CMD_QUERY_RANGEXS_CMD_QUERY_OP_FILTER$vno$from$to);
        }
        
$this->execCommand($cmd);
    }
    return 
$this;
}

添加搜索過濾區間或范圍

addSearchLog() 方法 (自版本 v1.1.1 起可用)
public void addSearchLog(string $query, int $wdf=1)
$query string 需要記錄的數據
$wdf int 需要記錄的次數, 默認為 1
源碼: sdk/php/lib/XSSearch.class.php#L894 (顯示)
public function addSearchLog($query$wdf 1)
{
    
$cmd = array('cmd' => XS_CMD_SEARCH_ADD_LOG'buf' => $query);
    if (
$wdf 1) {
        
$cmd['buf1'] = pack('i'$wdf);
    }
    
$this->execCommand($cmdXS_CMD_OK_LOGGED);
}

添加搜索日志關鍵詞到緩沖區里 需要調用 XSIndex::flushLogging 才能確保立即刷新, 否則要隔一段時間

addWeight() 方法
public XSSearch addWeight(string $field, string $term, float $weight=1)
$field string 索引詞所屬的字段
$term string 索引詞
$weight float 權重計算縮放比例
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L447 (顯示)
public function addWeight($field$term$weight 1)
{
    return 
$this->addQueryTerm($field$termXS_CMD_QUERY_OP_AND_MAYBE$weight);
}

添加權重索引詞 無論是否包含這種詞都不影響搜索匹配, 但會參與計算結果權重, 使結果的相關度更高

參見

count() 方法
public int count(string $query=NULL)
$query string 搜索語句, 若傳入 null 使用默認語句, 調用后會還原默認排序方式 如果搜索語句和最近一次 search 的語句一樣, 請改用 getLastCount 以提升效率 最大長度為 80 字節
{return} int 匹配的搜索結果數量, 估算數值
源碼: sdk/php/lib/XSSearch.class.php#L610 (顯示)
public function count($query null)
{
    
$query $query === null '' $this->preQueryString($query);
    if (
$query === '' && $this->_count !== null) {
        return 
$this->_count;
    }

    
$cmd = new XSCommand(XS_CMD_SEARCH_GET_TOTAL0$this->_defaultOp$query);
    
$res $this->execCommand($cmdXS_CMD_OK_SEARCH_TOTAL);
    
$ret unpack('Icount'$res->buf);

    if (
$query === '') {
        
$this->_count $ret['count'];
    }
    return 
$ret['count'];
}

估算搜索語句的匹配數據量

getAllSynonyms() 方法 (自版本 v1.3.0 起可用)
public array getAllSynonyms(int $limit=0, int $offset=0, bool $stemmed=false)
$limit int 數量上限, 若設為 0 則啟用默認值 100 個
$offset int 偏移量, 即跳過的結果數量, 默認為 0
$stemmed bool 是否包含處理過的詞根同義詞, 默認為 false 表示否
{return} array 同義詞記錄數組, 每個詞條為鍵, 同義詞條組成的數組為值
源碼: sdk/php/lib/XSSearch.class.php#L179 (顯示)
public function getAllSynonyms($limit 0$offset 0$stemmed false)
{
    
$page $limit pack('II'intval($offset), intval($limit)) : '';
    
$cmd = array('cmd' => XS_CMD_SEARCH_GET_SYNONYMS'buf1' => $page);
    
$cmd['arg1'] = $stemmed == true 0;
    
$res $this->execCommand($cmdXS_CMD_OK_RESULT_SYNONYMS);
    
$ret = array();
    if (!empty(
$res->buf)) {
        foreach (
explode("\n"$res->buf) as $line) {
            
$value explode("\t"$line);
            
$key array_shift($value);
            
$ret[$key] = $value;
        }
    }
    return 
$ret;
}

獲取當前庫內的全部同義詞列表

getCorrectedQuery() 方法
public array getCorrectedQuery(string $query=NULL)
$query string 需要展開的前綴, 可為拼音、英文、中文
{return} array 返回搜索詞組成的數組
源碼: sdk/php/lib/XSSearch.class.php#L858 (顯示)
public function getCorrectedQuery($query null)
{
    
$ret = array();

    try {
        if (
$query === null) {
            if (
$this->_count && $this->_count ceil($this->getDbTotal() * 0.001)) {
                return 
$ret;
            }
            
$query $this->cleanFieldQuery($this->_query);
        }
        if (empty(
$query) || strpos($query':') !== false) {
            return 
$ret;
        }
        
$buf XS::convert($query'UTF-8'$this->_charset);
        
$cmd = array('cmd' => XS_CMD_QUERY_GET_CORRECTED'buf' => $buf);
        
$res $this->execCommand($cmdXS_CMD_OK_QUERY_CORRECTED);
        if (
$res->buf !== '') {
            
$ret explode("\n"XS::convert($res->buf$this->_charset'UTF-8'));
        }
    } catch (
XSException $e) {
        if (
$e->getCode() != XS_CMD_ERR_XAPIAN) {
            throw 
$e;
        }
    }

    return 
$ret;
}

獲取修正后的搜索詞列表 通常當某次檢索結果數量偏少時, 可以用該函數設計 "你是不是要找: ..." 功能

getDbTotal() 方法
public int getDbTotal()
{return} int 數據總量
源碼: sdk/php/lib/XSSearch.class.php#L722 (顯示)
public function getDbTotal()
{
    
$cmd = new XSCommand(XS_CMD_SEARCH_DB_TOTAL);
    
$res $this->execCommand($cmdXS_CMD_OK_DB_TOTAL);
    
$tmp unpack('Itotal'$res->buf);
    return 
$tmp['total'];
}

獲取搜索數據庫內的數據總量

getExpandedQuery() 方法
public array getExpandedQuery(string $query, int $limit=10)
$query string 需要展開的前綴, 可為拼音、英文、中文
$limit int 需要返回的搜索詞數量上限, 默認為 10, 最大值為 20
{return} array 返回搜索詞組成的數組
源碼: sdk/php/lib/XSSearch.class.php#L818 (顯示)
public function getExpandedQuery($query$limit 10)
{
    
$ret = array();
    
$limit max(1min(20intval($limit)));

    try {
        
$buf XS::convert($query'UTF-8'$this->_charset);
        
$cmd = array('cmd' => XS_CMD_QUERY_GET_EXPANDED'arg1' => $limit'buf' => $buf);
        
$res $this->execCommand($cmdXS_CMD_OK_RESULT_BEGIN);

        
// echo "Raw Query: " . $res->buf . "\n";
        // get result documents
        
while (true) {
            
$res $this->getRespond();
            if (
$res->cmd == XS_CMD_SEARCH_RESULT_FIELD) {
                
$ret[] = XS::convert($res->buf$this->_charset'UTF-8');
            } elseif (
$res->cmd == XS_CMD_OK && $res->arg == XS_CMD_OK_RESULT_END) {
                
// got the end
                // echo "Parsed Query: " . $res->buf . "\n";
                
break;
            } else {
                
$msg 'Unexpected respond in search {CMD:' $res->cmd ', ARG:' $res->arg '}';
                throw new 
XSException($msg);
            }
        }
    } catch (
XSException $e) {
        if (
$e->getCode() != XS_CMD_ERR_XAPIAN) {
            throw 
$e;
        }
    }

    return 
$ret;
}

獲取展開的搜索詞列表

getFacets() 方法 (自版本 v1.1.0 起可用)
public array getFacets(string $field=NULL)
$field string 讀取分面記數的字段, 若為 null 則返回全部分面搜索記錄
{return} array 返回由值和計數組成的關聯數組, 若不存在或未曾登記過則返回空數組
源碼: sdk/php/lib/XSSearch.class.php#L490 (顯示)
public function getFacets($field null)
{
    if (
$field === null) {
        return 
$this->_facets;
    }
    return isset(
$this->_facets[$field]) ? $this->_facets[$field] : array();
}

讀取最近一次分面搜索記數 必須在某一次 search 之后調用本函數才有意義

getHotQuery() 方法
public array getHotQuery(int $limit=6, string $type='total')
$limit int 需要返回的熱門搜索數量上限, 默認為 6, 最大值為 50
$type string 排序類型, 默認為 total(搜索總量), 可選值還有 lastnum(上周), currnum(本周)
{return} array 返回以搜索詞為鍵, 搜索指數為值的關聯數組
源碼: sdk/php/lib/XSSearch.class.php#L736 (顯示)
public function getHotQuery($limit 6$type 'total')
{
    
$ret = array();
    
$limit max(1min(50intval($limit)));

    
// query from log_db
    
$this->xs->setScheme(XSFieldScheme::logger());
    try {
        
$this->setDb(self::LOG_DB)->setLimit($limit);
        if (
$type !== 'lastnum' && $type !== 'currnum') {
            
$type 'total';
        }
        
$result $this->search($type ':1');
        foreach (
$result as $doc/* @var $doc XSDocument */ {
            
$body $doc->body;
            
$ret[$body] = $doc->f($type);
        }
        
$this->restoreDb();
    } catch (
XSException $e) {
        if (
$e->getCode() != XS_CMD_ERR_XAPIAN) {
            throw 
$e;
        }
    }
    
$this->xs->restoreScheme();

    return 
$ret;
}

獲取熱門搜索詞列表

getLastCount() 方法
public int getLastCount()
{return} int 匹配數據量, 如從未搜索則返回 false
源碼: sdk/php/lib/XSSearch.class.php#L713 (顯示)
public function getLastCount()
{
    return 
$this->_lastCount;
}

獲取最近那次搜索的匹配總數估值

參見

getQuery() 方法
public string getQuery(string $query=NULL)
$query string 搜索語句, 若傳入 null 使用默認語句
{return} string 返回解析后的搜索語句
源碼: sdk/php/lib/XSSearch.class.php#L219 (顯示)
public function getQuery($query null)
{
    
$query $query === null '' $this->preQueryString($query);
    
$cmd = new XSCommand(XS_CMD_QUERY_GET_STRING0$this->_defaultOp$query);
    
$res $this->execCommand($cmdXS_CMD_OK_QUERY_STRING);
    if (
strpos($res->buf'VALUE_RANGE') !== false) {
        
$regex '/(VALUE_RANGE) (\d+) (\S+) (.+?)(?=\))/';
        
$res->buf preg_replace_callback($regex, array($this'formatValueRange'), $res->buf);
    }
    if (
strpos($res->buf'VALUE_GE') !== false || strpos($res->buf'VALUE_LE') !== false) {
        
$regex '/(VALUE_[GL]E) (\d+) (.+?)(?=\))/';
        
$res->buf preg_replace_callback($regex, array($this'formatValueRange'), $res->buf);
    }
    return 
XS::convert($res->buf$this->_charset'UTF-8');
}

獲取解析后的搜索語句

getRelatedQuery() 方法
public array getRelatedQuery(string $query=NULL, int $limit=6)
$query string 搜索語句, 若傳入 null 使用默認語句
$limit int 需要返回的相關搜索數量上限, 默認為 6, 最大值為 20
{return} array 返回搜索詞組成的數組
源碼: sdk/php/lib/XSSearch.class.php#L770 (顯示)
public function getRelatedQuery($query null$limit 6)
{
    
$ret = array();
    
$limit max(1min(20intval($limit)));

    
// Simple to disable query with field filter
    
if ($query === null) {
        
$query $this->cleanFieldQuery($this->_query);
    }

    if (empty(
$query) || strpos($query':') !== false) {
        return 
$ret;
    }

    
// Search the log database
    
$op $this->_defaultOp;
    
$this->xs->setScheme(XSFieldScheme::logger());
    try {
        
$result $this->setDb(self::LOG_DB)->setFuzzy()->setLimit($limit 1)->search($query);
        foreach (
$result as $doc/* @var $doc XSDocument */ {
            
$doc->setCharset($this->_charset);
            
$body $doc->body;
            if (!
strcasecmp($body$query)) {
                continue;
            }
            
$ret[] = $body;
            if (
count($ret) == $limit) {
                break;
            }
        }
    } catch (
XSException $e) {
        if (
$e->getCode() != XS_CMD_ERR_XAPIAN) {
            throw 
$e;
        }
    }
    
$this->restoreDb();
    
$this->xs->restoreScheme();
    
$this->_defaultOp $op;

    return 
$ret;
}

獲取相關搜索詞列表

getSynonyms() 方法 (自版本 v1.4.9 起可用)
public array getSynonyms(string $term)
$term string 要查詢同義詞的原詞
{return} array 同義詞記錄數組, 不存在同義詞則返回空數組
源碼: sdk/php/lib/XSSearch.class.php#L202 (顯示)
public function getSynonyms($term)
{
    
$term strval($term);
    if (
strlen($term) === 0) {
        return 
false;
    }
    
$cmd = array('cmd' => XS_CMD_SEARCH_GET_SYNONYMS'arg1' => 2'buf' => $term);
    
$res $this->execCommand($cmdXS_CMD_OK_RESULT_SYNONYMS);
    
$ret $res->buf === '' ? array() : explode("\n"$res->buf);
    return 
$ret;
}

獲取指定詞匯的同義詞列表

highlight() 方法
public string highlight(string $value, $strtr=false)
$value string 需要處理的數據
$strtr
{return} string 高亮后的數據
源碼: sdk/php/lib/XSSearch.class.php#L909 (顯示)
public function highlight($value$strtr false)
{
    
// return empty value directly
    
if (empty($value)) {
        return 
$value;
    }

    
// initlize the highlight replacements
    
if (!is_array($this->_highlight)) {
        
$this->initHighlight();
    }

    
// process replace
    
if (isset($this->_highlight['pattern'])) {
        
$value preg_replace($this->_highlight['pattern'], $this->_highlight['replace'], $value);
    }
    if (isset(
$this->_highlight['pairs'])) {
        
$value $strtr ?
            
strtr($value$this->_highlight['pairs']) :
            
str_replace(array_keys($this->_highlight['pairs']), array_values($this->_highlight['pairs']), $value);
    }
    return 
$value;
}

搜索結果字符串高亮處理 對搜索結果文檔的字段進行高亮、飄紅處理, 高亮部分加上 em 標記

markResetScheme() 方法
public void markResetScheme()
源碼: sdk/php/lib/XSSearch.class.php#L567 (顯示)
public function markResetScheme()
{
    
$this->_resetScheme true;
}

標記字段方案重置

參見

open() 方法
public void open(string $conn)
$conn string
源碼: sdk/php/lib/XSSearch.class.php#L55 (顯示)
public function open($conn)
{
    
parent::open($conn);
    
$this->_prefix = array();
    
$this->_fieldSet false;
    
$this->_lastCount false;
}

連接搜索服務端并初始化 每次重新連接后所有的搜索語句相關設置均被還原

參見

search() 方法
public XSDocument[] search(string $query=NULL, boolean $saveHighlight=true)
$query string 搜索語句, 若傳入 null 使用默認語句, 最大長度為 80 字節
$saveHighlight boolean 是否存儲查詢詞用于高亮處理, 默認為 true
{return} XSDocument[] 匹配的搜索結果文檔列表
源碼: sdk/php/lib/XSSearch.class.php#L635 (顯示)
public function search($query null$saveHighlight true)
{
    if (
$this->_curDb !== self::LOG_DB && $saveHighlight) {
        
$this->_highlight $query;
    }
    
$query $query === null '' $this->preQueryString($query);
    
$page pack('II'$this->_offset$this->_limit $this->_limit self::PAGE_SIZE);

    
// get result header
    
$cmd = new XSCommand(XS_CMD_SEARCH_GET_RESULT0$this->_defaultOp$query$page);
    
$res $this->execCommand($cmdXS_CMD_OK_RESULT_BEGIN);
    
$tmp unpack('Icount'$res->buf);
    
$this->_lastCount $tmp['count'];

    
// load vno map to name of fields
    
$ret $this->_facets = array();
    
$vnoes $this->xs->getScheme()->getVnoMap();

    
// get result documents
    
while (true) {
        
$res $this->getRespond();
        if (
$res->cmd == XS_CMD_SEARCH_RESULT_FACETS) {
            
$off 0;
            while ((
$off 6) < strlen($res->buf)) {
                
$tmp unpack('Cvno/Cvlen/Inum'substr($res->buf$off6));
                if (isset(
$vnoes[$tmp['vno']])) {
                    
$name $vnoes[$tmp['vno']];
                    
$value substr($res->buf$off 6$tmp['vlen']);
                    if (!isset(
$this->_facets[$name])) {
                        
$this->_facets[$name] = array();
                    }
                    
$this->_facets[$name][$value] = $tmp['num'];
                }
                
$off += $tmp['vlen'] + 6;
            }
        } elseif (
$res->cmd == XS_CMD_SEARCH_RESULT_DOC) {
            
// got new doc
            
$doc = new XSDocument($res->buf$this->_charset);
            
$ret[] = $doc;
        } elseif (
$res->cmd == XS_CMD_SEARCH_RESULT_FIELD) {
            
// fields of doc
            
if (isset($doc)) {
                
$name = isset($vnoes[$res->arg]) ? $vnoes[$res->arg] : $res->arg;
                
$doc->setField($name$res->buf);
            }
        } elseif (
$res->cmd == XS_CMD_SEARCH_RESULT_MATCHED) {
            
// matched terms
            
if (isset($doc)) {
                
$doc->setField('matched'explode(' '$res->buf), true);
            }
        } elseif (
$res->cmd == XS_CMD_OK && $res->arg == XS_CMD_OK_RESULT_END) {
            
// got the end
            
break;
        } else {
            
$msg 'Unexpected respond in search {CMD:' $res->cmd ', ARG:' $res->arg '}';
            throw new 
XSException($msg);
        }
    }

    if (
$query === '') {
        
$this->_count $this->_lastCount;
        
// trigger log & highlight
        
if ($this->_curDb !== self::LOG_DB) {
            
$this->logQuery();
            if (
$saveHighlight) {
                
$this->initHighlight();
            }
        }
    }
    
$this->_limit $this->_offset 0;
    return 
$ret;
}

獲取匹配的搜索結果文檔 默認提取最匹配的前 self::PAGE_SIZE 個結果 如需分頁請參見 setLimit 設置, 每次調用本函數后都會還原 setLimit 的設置

setAutoSynonyms() 方法 (自版本 v1.3.0 起可用)
public XSSearch setAutoSynonyms(bool $value=true)
$value bool 設為 true 表示開啟同義詞功能, 設為 false 關閉同義詞功能
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L144 (顯示)
public function setAutoSynonyms($value true)
{
    
$flag XS_CMD_PARSE_FLAG_BOOLEAN XS_CMD_PARSE_FLAG_PHRASE XS_CMD_PARSE_FLAG_LOVEHATE;
    if (
$value === true) {
        
$flag |= XS_CMD_PARSE_FLAG_AUTO_MULTIWORD_SYNONYMS;
    }
    
$cmd = array('cmd' => XS_CMD_QUERY_PARSEFLAG'arg' => $flag);
    
$this->execCommand($cmd);
    return 
$this;
}

開啟自動同義詞搜索功能

setCharset() 方法
public XSSearch setCharset(string $charset)
$charset string
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L69 (顯示)
public function setCharset($charset)
{
    
$this->_charset strtoupper($charset);
    if (
$this->_charset == 'UTF8') {
        
$this->_charset 'UTF-8';
    }
    return 
$this;
}

設置字符集 默認字符集是 UTF-8, 如果您提交的搜索語句和預期得到的搜索結果為其它字符集, 請先設置

setCollapse() 方法
public XSSearch setCollapse(string $field, int $num=1)
$field string 依據該字段的值折疊搜索結果, 設為 null 則取消折疊
$num int 折疊后只是返最匹配的數據數量, 默認為 1, 最大值 255
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L393 (顯示)
public function setCollapse($field$num 1)
{
    
$vno $field === null XSFieldScheme::MIXED_VNO $this->xs->getField($fieldtrue)->vno;
    
$max min(255intval($num));

    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_COLLAPSE$max$vno);
    
$this->execCommand($cmd);
    return 
$this;
}

設置折疊搜索結果 注意, 每當調用 setDbaddDb 修改當前數據庫時會重置此項設置

setCutOff() 方法
public XSSearch setCutOff(int $percent, float $weight=0)
$percent int 剔除匹配百分比低于此值的文檔, 值范圍 0-100
$weight float 剔除權重低于此值的文檔, 值范圍 0.1-25.5, 0 表示不剔除
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L98 (顯示)
public function setCutOff($percent$weight 0)
{
    
$percent max(0min(100intval($percent)));
    
$weight max(0, (intval($weight 10) & 255));
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_CUTOFF$percent$weight);
    
$this->execCommand($cmd);
    return 
$this;
}

設置百分比/權重剔除參數 通常是在開啟 setFuzzy 或使用 OR 連接搜索語句時才需要設置此項

參見

setDb() 方法
public XSSearch setDb(string $name)
$name string
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L538 (顯示)
public function setDb($name)
{
    
$name strval($name);
    
$this->execCommand(array('cmd' => XS_CMD_SEARCH_SET_DB'buf' => strval($name)));
    
$this->_lastDb $this->_curDb;
    
$this->_lastDbs $this->_curDbs;
    
$this->_curDb $name;
    
$this->_curDbs = array();
    return 
$this;
}

設置要搜索的數據庫名 若未設置, 使用默認數據庫, 數據庫必須位于服務端用戶目錄下 對于遠程數據庫, 請使用 stub 文件來支持

setDocOrder() 方法
public XSSearch setDocOrder(bool $asc=false)
$asc bool 是否為正序排列, 即從先到后, 默認為反序
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L378 (顯示)
public function setDocOrder($asc false)
{
    
$type XS_CMD_SORT_TYPE_DOCID | ($asc XS_CMD_SORT_FLAG_ASCENDING 0);
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORT$type);
    
$this->execCommand($cmd);
    return 
$this;
}

設置結果按索引入庫先后排序 注意, 此項排序不影響相關排序, 權重高的仍會在前面, 主要適合用于布爾檢索

setFacets() 方法 (自版本 v1.1.0 起可用)
public XSSearch setFacets(mixed $field, bool $exact=false)
$field mixed 要進行分組統計的字段或字段組成的數組, 最多同時支持 8 個
$exact bool 是否要求絕對精確搜索, 這會造成較大的系統開銷
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L464 (顯示)
public function setFacets($field$exact false)
{
    
$buf '';
    if (!
is_array($field)) {
        
$field = array($field);
    }
    foreach (
$field as $name) {
        
$ff $this->xs->getField($name);
        if (
$ff->type !== XSFieldMeta::TYPE_STRING) {
            throw new 
XSException("Field `$name' cann't be used for facets search, can only be string type");
        }
        
$buf .= chr($ff->vno);
    }
    
$cmd = array('cmd' => XS_CMD_SEARCH_SET_FACETS'buf' => $buf);
    
$cmd['arg1'] = $exact === true 0;
    
$this->execCommand($cmd);
    return 
$this;
}

設置分面搜索記數 用于記錄匹配搜索結果中按字段值分組的數量統計, 每次調用 search 后會還原設置 對于多次調用 $exact 參數以最后一次為準, 只支持字段值不超過 255 字節的情況

自 v1.4.10 起自動對空值的字段按 term 分面統計(相當于多值)

setFuzzy() 方法
public XSSearch setFuzzy(bool $value=true)
$value bool 設為 true 表示開啟模糊搜索, 設為 false 關閉模糊搜索
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L84 (顯示)
public function setFuzzy($value true)
{
    
$this->_defaultOp $value === true XS_CMD_QUERY_OP_OR XS_CMD_QUERY_OP_AND;
    return 
$this;
}

開啟模糊搜索 默認情況只返回包含所有搜索詞的記錄, 通過本方法可以獲得更多搜索結果

setGeodistSort() 方法 (自版本 v1.4.10 起可用)
public XSSearch setGeodistSort(array $fields, bool $reverse=false, bool $relevance_first=false)
$fields array 在此定義地理位置信息原點坐標信息,數組至少必須包含2個值
$reverse bool 是否由遠及近排序, 默認為由近及遠
$relevance_first bool 是否優先相關性排序, 默認為否
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L266 (顯示)
public function setGeodistSort($fields$reverse false$relevance_first false)
{
    if (!
is_array($fields) || count($fields) < 2) {
        throw new 
XSException("Fields of `setGeodistSort' should be an array contain two or more elements");
    }
    
// [vno][vlen][vbuf] ...
    
$buf '';
    foreach (
$fields as $key => $value) {
        
$field $this->xs->getField($keytrue);
        if (!
$field->isNumeric()) {
            throw new 
XSException("Type of GeoField `$key' shoud be numeric");
        }
        
$vno $field->vno;
        
$vbuf strval(floatval($value));
        
$vlen strlen($vbuf);
        if (
$vlen >= 255) {
            throw new 
XSException("Value of `$key' too long");
        }
        
$buf .= chr($vno) . chr($vlen) . $vbuf;
    }
    
$type XS_CMD_SORT_TYPE_GEODIST;
    if (
$relevance_first) {
        
$type |= XS_CMD_SORT_FLAG_RELEVANCE;
    }
    if (!
$reverse) {
        
$type |= XS_CMD_SORT_FLAG_ASCENDING;
    }
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORT$type0$buf);
    
$this->execCommand($cmd);
    return 
$this;
}

設置地理位置距離排序方式

請務必先以 numeric 類型字段定義經緯度坐標字段,例如用 lon 代表經度、lat 代表緯度, 那么設置排序代碼如下,必須將經度定義在前緯度在后:

$search->setGeodistSort(array('lon' => 39.18, 'lat' => 120.51));

setLimit() 方法
public XSSearch setLimit(int $limit, int $offset=0)
$limit int 數量上限, 若設為 0 則啟用默認值 self::PAGE_SIZE
$offset int 偏移量, 即跳過的結果數量, 默認為 0
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L524 (顯示)
public function setLimit($limit$offset 0)
{
    
$this->_limit intval($limit);
    
$this->_offset intval($offset);
    return 
$this;
}

設置搜索結果的數量和偏移 用于搜索結果分頁, 每次調用 search 后會還原這2個變量到初始值

setMultiSort() 方法 (自版本 v1.1.0 起可用)
public XSSearch setMultiSort(array $fields, bool $reverse=false, bool $relevance_first=false)
$fields array 排序依據的字段數組, 以字段名稱為鍵, true/false 為值表示正序或逆序
$reverse bool 是否為倒序顯示, 默認為正向, 此處和 setSort 略有不同
$relevance_first bool 是否優先相關性排序, 默認為否
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L307 (顯示)
public function setMultiSort($fields$reverse false$relevance_first false)
{
    if (!
is_array($fields)) {
        return 
$this->setSort($fields, !$reverse$relevance_first);
    }

    
// [vno][0/1] (0:reverse,1:asc)
    
$buf '';
    foreach (
$fields as $key => $value) {
        if (
is_bool($value)) {
            
$vno $this->xs->getField($keytrue)->vno;
            
$asc $value;
        } else {
            
$vno $this->xs->getField($valuetrue)->vno;
            
$asc false;
        }
        if (
$vno != XSFieldScheme::MIXED_VNO) {
            
$buf .= chr($vno) . chr($asc 0);
        }
    }
    if (
$buf !== '') {
        
$type XS_CMD_SORT_TYPE_MULTI;
        if (
$relevance_first) {
            
$type |= XS_CMD_SORT_FLAG_RELEVANCE;
        }
        if (!
$reverse) {
            
$type |= XS_CMD_SORT_FLAG_ASCENDING;
        }
        
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORT$type0$buf);
        
$this->execCommand($cmd);
    }
    return 
$this;
}

設置多字段組合排序方式 當您需要根據多個字段的值按不同的方式綜合排序時, 請使用這項

setQuery() 方法
public XSSearch setQuery(string $query)
$query string 搜索語句, 設為 null 則清空搜索語句, 最大長度為 80 字節
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L242 (顯示)
public function setQuery($query)
{
    
$this->clearQuery();
    if (
$query !== null) {
        
$this->_query $query;
        
$this->addQueryString($query);
    }
    return 
$this;
}

設置默認搜索語句 用于不帶參數的 countsearch 以及 terms 調用 可與 addWeight 組合運用

setRequireMatchedTerm() 方法 (自版本 v1.4.8 起可用)
public XSSearch setRequireMatchedTerm(bool $value=true)
$value bool 設為 true 表示開啟返回, 設為 false 關閉該功能, 默認是不開啟
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L114 (顯示)
public function setRequireMatchedTerm($value true)
{
    
$arg1 XS_CMD_SEARCH_MISC_MATCHED_TERM;
    
$arg2 $value === true 0;
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_MISC$arg1$arg2);
    
$this->execCommand($cmd);
    return 
$this;
}

設置在搜索結果文檔中返回匹配詞表 請在 search 前調用本方法, 然后使用 XSDocument::matched 獲取

setScwsMulti() 方法 (自版本 v1.4.7 起可用)
public XSSearch setScwsMulti(int $level)
$level int 要設置的分詞復合等級
{return} XSSearch 返回自身對象以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L507 (顯示)
public function setScwsMulti($level)
{
    
$level intval($level);
    if (
$level >= && $level 16) {
        
$cmd = array('cmd' => XS_CMD_SEARCH_SCWS_SET'arg1' => XS_CMD_SCWS_SET_MULTI'arg2' => $level);
        
$this->execCommand($cmd);
    }
    return 
$this;
}

設置當前搜索語句的分詞復合等級 復合等級是 scws 分詞粒度控制的一個重要參數, 是長詞細分處理依據, 默認為 3, 值范圍 0~15 注意: 這個設置僅直對本次搜索有效, 僅對設置之后的 setQuery 起作用, 由于 query 設計的方式問題, 目前無法支持搜索語句單字切分, 但您可以在模糊檢索時設為 0 來關閉復合分詞

setSort() 方法
public XSSearch setSort(string $field, bool $asc=false, bool $relevance_first=false)
$field string 依據指定字段的值排序, 設為 null 則用默認順序
$asc bool 是否為正序排列, 即從小到大, 從少到多, 默認為反序
$relevance_first bool 是否優先相關性排序, 默認為否
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L350 (顯示)
public function setSort($field$asc false$relevance_first false)
{
    if (
is_array($field)) {
        return 
$this->setMultiSort($field$asc$relevance_first);
    }
    if (
$field === null) {
        
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORTXS_CMD_SORT_TYPE_RELEVANCE);
    } else {
        
$type XS_CMD_SORT_TYPE_VALUE;
        if (
$relevance_first) {
            
$type |= XS_CMD_SORT_FLAG_RELEVANCE;
        }
        if (
$asc) {
            
$type |= XS_CMD_SORT_FLAG_ASCENDING;
        }
        
$vno $this->xs->getField($fieldtrue)->vno;
        
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORT$type$vno);
    }
    
$this->execCommand($cmd);
    return 
$this;
}

設置搜索結果的排序方式 注意, 每當調用 setDbaddDb 修改當前數據庫時會重置排序設定 此函數第一參數的用法與 setMultiSort 兼容, 即也可以用該方法實現多字段排序

setSynonymScale() 方法 (自版本 v1.4.7 起可用)
public XSSearch setSynonymScale(float $value)
$value float 取值范圍 0.01-2.55, 1 表示不調整
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L162 (顯示)
public function setSynonymScale($value)
{
    
$arg1 XS_CMD_SEARCH_MISC_SYN_SCALE;
    
$arg2 max(0, (intval($value 100) & 255));
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_MISC$arg1$arg2);
    
$this->execCommand($cmd);
    return 
$this;
}

設置同義詞搜索的權重比例

setWeightingScheme() 方法 (自版本 v1.4.11 起可用)
public XSSearch setWeightingScheme(int $scheme)
$scheme int 匹配權重方案
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L130 (顯示)
public function setWeightingScheme($scheme) {
    
$arg1 XS_CMD_SEARCH_MISC_WEIGHT_SCHEME;
    
$arg2 intval($scheme);
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_MISC$arg1$arg2);
    
$this->execCommand($cmd);
    return 
$this;
}

設置檢索匹配的權重方案 目前支持三種權重方案: 0=BM25/1=Bool/2=Trad

terms() 方法
public array terms(string $query=NULL, bool $convert=true)
$query string 搜索語句, 若傳入 null 使用默認語句, 最大長度為 80 字節
$convert bool 是否進行編碼轉換, 默認為 true
{return} array 可用于高亮顯示的詞條列表
源碼: sdk/php/lib/XSSearch.class.php#L578 (顯示)
public function terms($query null$convert true)
{
    
$query $query === null '' $this->preQueryString($query);

    if (
$query === '' && $this->_terms !== null) {
        
$ret $this->_terms;
    } else {
        
$cmd = new XSCommand(XS_CMD_QUERY_GET_TERMS0$this->_defaultOp$query);
        
$res $this->execCommand($cmdXS_CMD_OK_QUERY_TERMS);
        
$ret = array();

        
$tmps explode(' '$res->buf);
        for (
$i 0$i count($tmps); $i++) {
            if (
$tmps[$i] === '' || strpos($tmps[$i], ':') !== false) {
                continue;
            }
            
$ret[] = $tmps[$i];
        }
        if (
$query === '') {
            
$this->_terms $ret;
        }
    }
    return 
$convert XS::convert($ret$this->_charset'UTF-8') : $ret;
}

獲取搜索語句中的高亮詞條列表

XSSearch - 類參考 - 迅搜(xunsearch) - 開源免費中文全文搜索引擎

文檔說明

XSSearch

XS
繼承關系 class XSSearch » XSServer » XSComponent
版本 1.0.0
源代碼 sdk/php/lib/XSSearch.class.php
XS 搜索類, 執行搜索功能 有部分方法支持串接操作
$xs->search->setQuery($str)->setLimit(10, 10)->search();
$xs->close();

Public 屬性

隱去繼承來的屬性

名稱類型描述定義于
allSynonyms array 獲取當前庫內的全部同義詞列表 XSSearch
connString string 連接字符串 XSServer
correctedQuery array 獲取修正后的搜索詞列表 XSSearch
dbTotal int 獲取搜索數據庫內的數據總量 XSSearch
facets array 讀取最近一次分面搜索記數 XSSearch
hotQuery array 獲取熱門搜索詞列表 XSSearch
lastCount int 獲取最近那次搜索的匹配總數估值 XSSearch
project string 獲取當前項目名稱 XSServer
query string 獲取解析后的搜索語句 XSSearch
relatedQuery array 獲取相關搜索詞列表 XSSearch
respond XSCommand 從服務器讀取響應指令 XSServer
socket mixed 獲取連接資源描述符 XSServer
xs XS 服務端關聯的 XS 對象 XSServer

Public 方法

隱去繼承來的方法

名稱描述定義于
__construct() 構造函數, 打開連接 XSServer
__destruct() 析構函數, 關閉連接 XSServer
__get() 魔術方法 __get XSComponent
__isset() 魔術方法 __isset XSComponent
__set() 魔術方法 __set XSComponent
__unset() 魔術方法 __unset XSComponent
addDb() 添加搜索的數據庫名, 支持多庫同時搜索 XSSearch
addQueryString() 增加默認搜索語句 XSSearch
addQueryTerm() 增加默認搜索詞匯 XSSearch
addRange() 添加搜索過濾區間或范圍 XSSearch
addSearchLog() 添加搜索日志關鍵詞到緩沖區里 XSSearch
addWeight() 添加權重索引詞 XSSearch
close() 關閉連接 XSServer
count() 估算搜索語句的匹配數據量 XSSearch
execCommand() 執行服務端指令并獲取返回值 XSServer
getAllSynonyms() 獲取當前庫內的全部同義詞列表 XSSearch
getConnString() Returns 連接字符串 XSServer
getCorrectedQuery() 獲取修正后的搜索詞列表 XSSearch
getDbTotal() 獲取搜索數據庫內的數據總量 XSSearch
getExpandedQuery() 獲取展開的搜索詞列表 XSSearch
getFacets() 讀取最近一次分面搜索記數 XSSearch
getHotQuery() 獲取熱門搜索詞列表 XSSearch
getLastCount() 獲取最近那次搜索的匹配總數估值 XSSearch
getProject() 獲取當前項目名稱 XSServer
getQuery() 獲取解析后的搜索語句 XSSearch
getRelatedQuery() 獲取相關搜索詞列表 XSSearch
getRespond() 從服務器讀取響應指令 XSServer
getSocket() 獲取連接資源描述符 XSServer
getSynonyms() 獲取指定詞匯的同義詞列表 XSSearch
hasRespond() 判斷服務端是否有可讀數據 XSServer
highlight() 搜索結果字符串高亮處理 XSSearch
markResetScheme() 標記字段方案重置 XSSearch
open() 連接搜索服務端并初始化 XSSearch
reopen() 重新打開連接 XSServer
sendCommand() 往服務器直接發送指令 (無緩存) XSServer
setAutoSynonyms() 開啟自動同義詞搜索功能 XSSearch
setCharset() 設置字符集 XSSearch
setCollapse() 設置折疊搜索結果 XSSearch
setCutOff() 設置百分比/權重剔除參數 XSSearch
setDb() 設置要搜索的數據庫名 XSSearch
setDocOrder() 設置結果按索引入庫先后排序 XSSearch
setFacets() 設置分面搜索記數 XSSearch
setFuzzy() 開啟模糊搜索 XSSearch
setGeodistSort() 設置地理位置距離排序方式 XSSearch
setLimit() 設置搜索結果的數量和偏移 XSSearch
setMultiSort() 設置多字段組合排序方式 XSSearch
setProject() 設置當前項目 XSServer
setQuery() 設置默認搜索語句 XSSearch
setRequireMatchedTerm() 設置在搜索結果文檔中返回匹配詞表 XSSearch
setScwsMulti() 設置當前搜索語句的分詞復合等級 XSSearch
setSort() 設置搜索結果的排序方式 XSSearch
setSynonymScale() 設置同義詞搜索的權重比例 XSSearch
setTimeout() 設置服務端超時秒數 XSServer
setWeightingScheme() 設置檢索匹配的權重方案 XSSearch
terms() 獲取搜索語句中的高亮詞條列表 XSSearch

Protected 方法

隱去繼承來的方法

名稱描述定義于
check() 檢測服務端的連接情況 XSServer
connect() 連接服務端 XSServer
read() 讀取數據 XSServer
write() 寫入數據 XSServer

屬性明細

allSynonyms 屬性 只讀 (自版本 v1.3.0 起可用)
public array getAllSynonyms(int $limit=0, int $offset=0, bool $stemmed=false)

獲取當前庫內的全部同義詞列表

correctedQuery 屬性 只讀
public array getCorrectedQuery(string $query=NULL)

獲取修正后的搜索詞列表 通常當某次檢索結果數量偏少時, 可以用該函數設計 "你是不是要找: ..." 功能

dbTotal 屬性 只讀
public int getDbTotal()

獲取搜索數據庫內的數據總量

facets 屬性 (自版本 v1.1.0 起可用)
public array getFacets(string $field=NULL)
public XSSearch setFacets(mixed $field, bool $exact=false)

讀取最近一次分面搜索記數 必須在某一次 search 之后調用本函數才有意義

hotQuery 屬性 只讀
public array getHotQuery(int $limit=6, string $type='total')

獲取熱門搜索詞列表

lastCount 屬性 只讀
public int getLastCount()

獲取最近那次搜索的匹配總數估值

參見

query 屬性
public string getQuery(string $query=NULL)
public XSSearch setQuery(string $query)

獲取解析后的搜索語句

relatedQuery 屬性 只讀
public array getRelatedQuery(string $query=NULL, int $limit=6)

獲取相關搜索詞列表

方法明細

addDb() 方法
public XSSearch addDb(string $name)
$name string
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L555 (顯示)
public function addDb($name)
{
    
$name strval($name);
    
$this->execCommand(array('cmd' => XS_CMD_SEARCH_ADD_DB'buf' => $name));
    
$this->_curDbs[] = $name;
    return 
$this;
}

添加搜索的數據庫名, 支持多庫同時搜索

參見

addQueryString() 方法
public string addQueryString(string $query, int $addOp=0, float $scale=1)
$query string 搜索語句
$addOp int 與舊語句的結合操作符, 如果無舊語句或為空則這此無意義, 支持的操作符有: XS_CMD_QUERY_OP_AND XS_CMD_QUERY_OP_OR XS_CMD_QUERY_OP_AND_NOT XS_CMD_QUERY_OP_XOR XS_CMD_QUERY_OP_AND_MAYBE XS_CMD_QUERY_OP_FILTER
$scale float 權重計算縮放比例, 默認為 1表示不縮放, 其它值范圍 0.xx ~ 655.35
{return} string 修正后的搜索語句
源碼: sdk/php/lib/XSSearch.class.php#L1012 (顯示)
public function addQueryString($query$addOp XS_CMD_QUERY_OP_AND$scale 1)
{
    
$query $this->preQueryString($query);
    
$bscale = ($scale && $scale != 1) ? pack('n'intval($scale 100)) : '';

    
$cmd = new XSCommand(XS_CMD_QUERY_PARSE$addOp$this->_defaultOp$query$bscale);
    
$this->execCommand($cmd);
    return 
$query;
}

增加默認搜索語句

addQueryTerm() 方法
public XSSearch addQueryTerm(string $field, string|array $term, int $addOp=0, float $scale=1)
$field string 索引詞所屬的字段, 若為混合區詞匯可設為 null 或 body 型的字段名
$term string|array 索引詞或列表
$addOp int 與舊語句的結合操作符, 如果無舊語句或為空則這此無意義, 支持的操作符有:
$scale float 權重計算縮放比例, 默認為 1表示不縮放, 其它值范圍 0.xx ~ 655.35
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L1033 (顯示)
public function addQueryTerm($field$term$addOp XS_CMD_QUERY_OP_AND$scale 1)
{
    
$term XS::convert($term'UTF-8'$this->_charset);
    
$bscale = ($scale && $scale != 1) ? pack('n'intval($scale 100)) : '';
    
$vno $field === null XSFieldScheme::MIXED_VNO $this->xs->getField($fieldtrue)->vno;
    
$cmd XS_CMD_QUERY_TERM;
    if (
is_array($term)) {
        if (
count($term) === 0) {
            return 
$this;
        } elseif (
count($term) === 1) {
            
$term current($term);
        } else {
            
$term implode("\t"$term);
            
$cmd XS_CMD_QUERY_TERMS;
        }
    }
    
$cmd = new XSCommand($cmd$addOp$vno$term$bscale);
    
$this->execCommand($cmd);
    return 
$this;
}

增加默認搜索詞匯

addRange() 方法
public XSSearch addRange(string $field, mixed $from, mixed $to)
$field string
$from mixed 起始值(不包含), 若設為 null 則相當于匹配 <= to (字典順序)
$to mixed 結束值(包含), 若設為 null 則相當于匹配 >= from (字典順序)
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L410 (顯示)
public function addRange($field$from$to)
{
    if (
$from === '' || $from === false) {
        
$from null;
    }
    if (
$to === '' || $to === false) {
        
$to null;
    }
    if (
$from !== null || $to !== null) {
        if (
strlen($from) > 255 || strlen($to) > 255) {
            throw new 
XSException('Value of range is too long');
        }

        
$vno $this->xs->getField($field)->vno;
        
$from XS::convert($from'UTF-8'$this->_charset);
        
$to XS::convert($to'UTF-8'$this->_charset);
        if (
$from === null) {
            
$cmd = new XSCommand(XS_CMD_QUERY_VALCMPXS_CMD_QUERY_OP_FILTER$vno$tochr(XS_CMD_VALCMP_LE));
        } elseif (
$to === null) {
            
$cmd = new XSCommand(XS_CMD_QUERY_VALCMPXS_CMD_QUERY_OP_FILTER$vno$fromchr(XS_CMD_VALCMP_GE));
        } else {
            
$cmd = new XSCommand(XS_CMD_QUERY_RANGEXS_CMD_QUERY_OP_FILTER$vno$from$to);
        }
        
$this->execCommand($cmd);
    }
    return 
$this;
}

添加搜索過濾區間或范圍

addSearchLog() 方法 (自版本 v1.1.1 起可用)
public void addSearchLog(string $query, int $wdf=1)
$query string 需要記錄的數據
$wdf int 需要記錄的次數, 默認為 1
源碼: sdk/php/lib/XSSearch.class.php#L894 (顯示)
public function addSearchLog($query$wdf 1)
{
    
$cmd = array('cmd' => XS_CMD_SEARCH_ADD_LOG'buf' => $query);
    if (
$wdf 1) {
        
$cmd['buf1'] = pack('i'$wdf);
    }
    
$this->execCommand($cmdXS_CMD_OK_LOGGED);
}

添加搜索日志關鍵詞到緩沖區里 需要調用 XSIndex::flushLogging 才能確保立即刷新, 否則要隔一段時間

addWeight() 方法
public XSSearch addWeight(string $field, string $term, float $weight=1)
$field string 索引詞所屬的字段
$term string 索引詞
$weight float 權重計算縮放比例
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L447 (顯示)
public function addWeight($field$term$weight 1)
{
    return 
$this->addQueryTerm($field$termXS_CMD_QUERY_OP_AND_MAYBE$weight);
}

添加權重索引詞 無論是否包含這種詞都不影響搜索匹配, 但會參與計算結果權重, 使結果的相關度更高

參見

count() 方法
public int count(string $query=NULL)
$query string 搜索語句, 若傳入 null 使用默認語句, 調用后會還原默認排序方式 如果搜索語句和最近一次 search 的語句一樣, 請改用 getLastCount 以提升效率 最大長度為 80 字節
{return} int 匹配的搜索結果數量, 估算數值
源碼: sdk/php/lib/XSSearch.class.php#L610 (顯示)
public function count($query null)
{
    
$query $query === null '' $this->preQueryString($query);
    if (
$query === '' && $this->_count !== null) {
        return 
$this->_count;
    }

    
$cmd = new XSCommand(XS_CMD_SEARCH_GET_TOTAL0$this->_defaultOp$query);
    
$res $this->execCommand($cmdXS_CMD_OK_SEARCH_TOTAL);
    
$ret unpack('Icount'$res->buf);

    if (
$query === '') {
        
$this->_count $ret['count'];
    }
    return 
$ret['count'];
}

估算搜索語句的匹配數據量

getAllSynonyms() 方法 (自版本 v1.3.0 起可用)
public array getAllSynonyms(int $limit=0, int $offset=0, bool $stemmed=false)
$limit int 數量上限, 若設為 0 則啟用默認值 100 個
$offset int 偏移量, 即跳過的結果數量, 默認為 0
$stemmed bool 是否包含處理過的詞根同義詞, 默認為 false 表示否
{return} array 同義詞記錄數組, 每個詞條為鍵, 同義詞條組成的數組為值
源碼: sdk/php/lib/XSSearch.class.php#L179 (顯示)
public function getAllSynonyms($limit 0$offset 0$stemmed false)
{
    
$page $limit pack('II'intval($offset), intval($limit)) : '';
    
$cmd = array('cmd' => XS_CMD_SEARCH_GET_SYNONYMS'buf1' => $page);
    
$cmd['arg1'] = $stemmed == true 0;
    
$res $this->execCommand($cmdXS_CMD_OK_RESULT_SYNONYMS);
    
$ret = array();
    if (!empty(
$res->buf)) {
        foreach (
explode("\n"$res->buf) as $line) {
            
$value explode("\t"$line);
            
$key array_shift($value);
            
$ret[$key] = $value;
        }
    }
    return 
$ret;
}

獲取當前庫內的全部同義詞列表

getCorrectedQuery() 方法
public array getCorrectedQuery(string $query=NULL)
$query string 需要展開的前綴, 可為拼音、英文、中文
{return} array 返回搜索詞組成的數組
源碼: sdk/php/lib/XSSearch.class.php#L858 (顯示)
public function getCorrectedQuery($query null)
{
    
$ret = array();

    try {
        if (
$query === null) {
            if (
$this->_count && $this->_count ceil($this->getDbTotal() * 0.001)) {
                return 
$ret;
            }
            
$query $this->cleanFieldQuery($this->_query);
        }
        if (empty(
$query) || strpos($query':') !== false) {
            return 
$ret;
        }
        
$buf XS::convert($query'UTF-8'$this->_charset);
        
$cmd = array('cmd' => XS_CMD_QUERY_GET_CORRECTED'buf' => $buf);
        
$res $this->execCommand($cmdXS_CMD_OK_QUERY_CORRECTED);
        if (
$res->buf !== '') {
            
$ret explode("\n"XS::convert($res->buf$this->_charset'UTF-8'));
        }
    } catch (
XSException $e) {
        if (
$e->getCode() != XS_CMD_ERR_XAPIAN) {
            throw 
$e;
        }
    }

    return 
$ret;
}

獲取修正后的搜索詞列表 通常當某次檢索結果數量偏少時, 可以用該函數設計 "你是不是要找: ..." 功能

getDbTotal() 方法
public int getDbTotal()
{return} int 數據總量
源碼: sdk/php/lib/XSSearch.class.php#L722 (顯示)
public function getDbTotal()
{
    
$cmd = new XSCommand(XS_CMD_SEARCH_DB_TOTAL);
    
$res $this->execCommand($cmdXS_CMD_OK_DB_TOTAL);
    
$tmp unpack('Itotal'$res->buf);
    return 
$tmp['total'];
}

獲取搜索數據庫內的數據總量

getExpandedQuery() 方法
public array getExpandedQuery(string $query, int $limit=10)
$query string 需要展開的前綴, 可為拼音、英文、中文
$limit int 需要返回的搜索詞數量上限, 默認為 10, 最大值為 20
{return} array 返回搜索詞組成的數組
源碼: sdk/php/lib/XSSearch.class.php#L818 (顯示)
public function getExpandedQuery($query$limit 10)
{
    
$ret = array();
    
$limit max(1min(20intval($limit)));

    try {
        
$buf XS::convert($query'UTF-8'$this->_charset);
        
$cmd = array('cmd' => XS_CMD_QUERY_GET_EXPANDED'arg1' => $limit'buf' => $buf);
        
$res $this->execCommand($cmdXS_CMD_OK_RESULT_BEGIN);

        
// echo "Raw Query: " . $res->buf . "\n";
        // get result documents
        
while (true) {
            
$res $this->getRespond();
            if (
$res->cmd == XS_CMD_SEARCH_RESULT_FIELD) {
                
$ret[] = XS::convert($res->buf$this->_charset'UTF-8');
            } elseif (
$res->cmd == XS_CMD_OK && $res->arg == XS_CMD_OK_RESULT_END) {
                
// got the end
                // echo "Parsed Query: " . $res->buf . "\n";
                
break;
            } else {
                
$msg 'Unexpected respond in search {CMD:' $res->cmd ', ARG:' $res->arg '}';
                throw new 
XSException($msg);
            }
        }
    } catch (
XSException $e) {
        if (
$e->getCode() != XS_CMD_ERR_XAPIAN) {
            throw 
$e;
        }
    }

    return 
$ret;
}

獲取展開的搜索詞列表

getFacets() 方法 (自版本 v1.1.0 起可用)
public array getFacets(string $field=NULL)
$field string 讀取分面記數的字段, 若為 null 則返回全部分面搜索記錄
{return} array 返回由值和計數組成的關聯數組, 若不存在或未曾登記過則返回空數組
源碼: sdk/php/lib/XSSearch.class.php#L490 (顯示)
public function getFacets($field null)
{
    if (
$field === null) {
        return 
$this->_facets;
    }
    return isset(
$this->_facets[$field]) ? $this->_facets[$field] : array();
}

讀取最近一次分面搜索記數 必須在某一次 search 之后調用本函數才有意義

getHotQuery() 方法
public array getHotQuery(int $limit=6, string $type='total')
$limit int 需要返回的熱門搜索數量上限, 默認為 6, 最大值為 50
$type string 排序類型, 默認為 total(搜索總量), 可選值還有 lastnum(上周), currnum(本周)
{return} array 返回以搜索詞為鍵, 搜索指數為值的關聯數組
源碼: sdk/php/lib/XSSearch.class.php#L736 (顯示)
public function getHotQuery($limit 6$type 'total')
{
    
$ret = array();
    
$limit max(1min(50intval($limit)));

    
// query from log_db
    
$this->xs->setScheme(XSFieldScheme::logger());
    try {
        
$this->setDb(self::LOG_DB)->setLimit($limit);
        if (
$type !== 'lastnum' && $type !== 'currnum') {
            
$type 'total';
        }
        
$result $this->search($type ':1');
        foreach (
$result as $doc/* @var $doc XSDocument */ {
            
$body $doc->body;
            
$ret[$body] = $doc->f($type);
        }
        
$this->restoreDb();
    } catch (
XSException $e) {
        if (
$e->getCode() != XS_CMD_ERR_XAPIAN) {
            throw 
$e;
        }
    }
    
$this->xs->restoreScheme();

    return 
$ret;
}

獲取熱門搜索詞列表

getLastCount() 方法
public int getLastCount()
{return} int 匹配數據量, 如從未搜索則返回 false
源碼: sdk/php/lib/XSSearch.class.php#L713 (顯示)
public function getLastCount()
{
    return 
$this->_lastCount;
}

獲取最近那次搜索的匹配總數估值

參見

getQuery() 方法
public string getQuery(string $query=NULL)
$query string 搜索語句, 若傳入 null 使用默認語句
{return} string 返回解析后的搜索語句
源碼: sdk/php/lib/XSSearch.class.php#L219 (顯示)
public function getQuery($query null)
{
    
$query $query === null '' $this->preQueryString($query);
    
$cmd = new XSCommand(XS_CMD_QUERY_GET_STRING0$this->_defaultOp$query);
    
$res $this->execCommand($cmdXS_CMD_OK_QUERY_STRING);
    if (
strpos($res->buf'VALUE_RANGE') !== false) {
        
$regex '/(VALUE_RANGE) (\d+) (\S+) (.+?)(?=\))/';
        
$res->buf preg_replace_callback($regex, array($this'formatValueRange'), $res->buf);
    }
    if (
strpos($res->buf'VALUE_GE') !== false || strpos($res->buf'VALUE_LE') !== false) {
        
$regex '/(VALUE_[GL]E) (\d+) (.+?)(?=\))/';
        
$res->buf preg_replace_callback($regex, array($this'formatValueRange'), $res->buf);
    }
    return 
XS::convert($res->buf$this->_charset'UTF-8');
}

獲取解析后的搜索語句

getRelatedQuery() 方法
public array getRelatedQuery(string $query=NULL, int $limit=6)
$query string 搜索語句, 若傳入 null 使用默認語句
$limit int 需要返回的相關搜索數量上限, 默認為 6, 最大值為 20
{return} array 返回搜索詞組成的數組
源碼: sdk/php/lib/XSSearch.class.php#L770 (顯示)
public function getRelatedQuery($query null$limit 6)
{
    
$ret = array();
    
$limit max(1min(20intval($limit)));

    
// Simple to disable query with field filter
    
if ($query === null) {
        
$query $this->cleanFieldQuery($this->_query);
    }

    if (empty(
$query) || strpos($query':') !== false) {
        return 
$ret;
    }

    
// Search the log database
    
$op $this->_defaultOp;
    
$this->xs->setScheme(XSFieldScheme::logger());
    try {
        
$result $this->setDb(self::LOG_DB)->setFuzzy()->setLimit($limit 1)->search($query);
        foreach (
$result as $doc/* @var $doc XSDocument */ {
            
$doc->setCharset($this->_charset);
            
$body $doc->body;
            if (!
strcasecmp($body$query)) {
                continue;
            }
            
$ret[] = $body;
            if (
count($ret) == $limit) {
                break;
            }
        }
    } catch (
XSException $e) {
        if (
$e->getCode() != XS_CMD_ERR_XAPIAN) {
            throw 
$e;
        }
    }
    
$this->restoreDb();
    
$this->xs->restoreScheme();
    
$this->_defaultOp $op;

    return 
$ret;
}

獲取相關搜索詞列表

getSynonyms() 方法 (自版本 v1.4.9 起可用)
public array getSynonyms(string $term)
$term string 要查詢同義詞的原詞
{return} array 同義詞記錄數組, 不存在同義詞則返回空數組
源碼: sdk/php/lib/XSSearch.class.php#L202 (顯示)
public function getSynonyms($term)
{
    
$term strval($term);
    if (
strlen($term) === 0) {
        return 
false;
    }
    
$cmd = array('cmd' => XS_CMD_SEARCH_GET_SYNONYMS'arg1' => 2'buf' => $term);
    
$res $this->execCommand($cmdXS_CMD_OK_RESULT_SYNONYMS);
    
$ret $res->buf === '' ? array() : explode("\n"$res->buf);
    return 
$ret;
}

獲取指定詞匯的同義詞列表

highlight() 方法
public string highlight(string $value, $strtr=false)
$value string 需要處理的數據
$strtr
{return} string 高亮后的數據
源碼: sdk/php/lib/XSSearch.class.php#L909 (顯示)
public function highlight($value$strtr false)
{
    
// return empty value directly
    
if (empty($value)) {
        return 
$value;
    }

    
// initlize the highlight replacements
    
if (!is_array($this->_highlight)) {
        
$this->initHighlight();
    }

    
// process replace
    
if (isset($this->_highlight['pattern'])) {
        
$value preg_replace($this->_highlight['pattern'], $this->_highlight['replace'], $value);
    }
    if (isset(
$this->_highlight['pairs'])) {
        
$value $strtr ?
            
strtr($value$this->_highlight['pairs']) :
            
str_replace(array_keys($this->_highlight['pairs']), array_values($this->_highlight['pairs']), $value);
    }
    return 
$value;
}

搜索結果字符串高亮處理 對搜索結果文檔的字段進行高亮、飄紅處理, 高亮部分加上 em 標記

markResetScheme() 方法
public void markResetScheme()
源碼: sdk/php/lib/XSSearch.class.php#L567 (顯示)
public function markResetScheme()
{
    
$this->_resetScheme true;
}

標記字段方案重置

參見

open() 方法
public void open(string $conn)
$conn string
源碼: sdk/php/lib/XSSearch.class.php#L55 (顯示)
public function open($conn)
{
    
parent::open($conn);
    
$this->_prefix = array();
    
$this->_fieldSet false;
    
$this->_lastCount false;
}

連接搜索服務端并初始化 每次重新連接后所有的搜索語句相關設置均被還原

search() 方法
public XSDocument[] search(string $query=NULL, boolean $saveHighlight=true)
$query string 搜索語句, 若傳入 null 使用默認語句, 最大長度為 80 字節
$saveHighlight boolean 是否存儲查詢詞用于高亮處理, 默認為 true
{return} XSDocument[] 匹配的搜索結果文檔列表
源碼: sdk/php/lib/XSSearch.class.php#L635 (顯示)
public function search($query null$saveHighlight true)
{
    if (
$this->_curDb !== self::LOG_DB && $saveHighlight) {
        
$this->_highlight $query;
    }
    
$query $query === null '' $this->preQueryString($query);
    
$page pack('II'$this->_offset$this->_limit $this->_limit self::PAGE_SIZE);

    
// get result header
    
$cmd = new XSCommand(XS_CMD_SEARCH_GET_RESULT0$this->_defaultOp$query$page);
    
$res $this->execCommand($cmdXS_CMD_OK_RESULT_BEGIN);
    
$tmp unpack('Icount'$res->buf);
    
$this->_lastCount $tmp['count'];

    
// load vno map to name of fields
    
$ret $this->_facets = array();
    
$vnoes $this->xs->getScheme()->getVnoMap();

    
// get result documents
    
while (true) {
        
$res $this->getRespond();
        if (
$res->cmd == XS_CMD_SEARCH_RESULT_FACETS) {
            
$off 0;
            while ((
$off 6) < strlen($res->buf)) {
                
$tmp unpack('Cvno/Cvlen/Inum'substr($res->buf$off6));
                if (isset(
$vnoes[$tmp['vno']])) {
                    
$name $vnoes[$tmp['vno']];
                    
$value substr($res->buf$off 6$tmp['vlen']);
                    if (!isset(
$this->_facets[$name])) {
                        
$this->_facets[$name] = array();
                    }
                    
$this->_facets[$name][$value] = $tmp['num'];
                }
                
$off += $tmp['vlen'] + 6;
            }
        } elseif (
$res->cmd == XS_CMD_SEARCH_RESULT_DOC) {
            
// got new doc
            
$doc = new XSDocument($res->buf$this->_charset);
            
$ret[] = $doc;
        } elseif (
$res->cmd == XS_CMD_SEARCH_RESULT_FIELD) {
            
// fields of doc
            
if (isset($doc)) {
                
$name = isset($vnoes[$res->arg]) ? $vnoes[$res->arg] : $res->arg;
                
$doc->setField($name$res->buf);
            }
        } elseif (
$res->cmd == XS_CMD_SEARCH_RESULT_MATCHED) {
            
// matched terms
            
if (isset($doc)) {
                
$doc->setField('matched'explode(' '$res->buf), true);
            }
        } elseif (
$res->cmd == XS_CMD_OK && $res->arg == XS_CMD_OK_RESULT_END) {
            
// got the end
            
break;
        } else {
            
$msg 'Unexpected respond in search {CMD:' $res->cmd ', ARG:' $res->arg '}';
            throw new 
XSException($msg);
        }
    }

    if (
$query === '') {
        
$this->_count $this->_lastCount;
        
// trigger log & highlight
        
if ($this->_curDb !== self::LOG_DB) {
            
$this->logQuery();
            if (
$saveHighlight) {
                
$this->initHighlight();
            }
        }
    }
    
$this->_limit $this->_offset 0;
    return 
$ret;
}

獲取匹配的搜索結果文檔 默認提取最匹配的前 self::PAGE_SIZE 個結果 如需分頁請參見 setLimit 設置, 每次調用本函數后都會還原 setLimit 的設置

setAutoSynonyms() 方法 (自版本 v1.3.0 起可用)
public XSSearch setAutoSynonyms(bool $value=true)
$value bool 設為 true 表示開啟同義詞功能, 設為 false 關閉同義詞功能
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L144 (顯示)
public function setAutoSynonyms($value true)
{
    
$flag XS_CMD_PARSE_FLAG_BOOLEAN XS_CMD_PARSE_FLAG_PHRASE XS_CMD_PARSE_FLAG_LOVEHATE;
    if (
$value === true) {
        
$flag |= XS_CMD_PARSE_FLAG_AUTO_MULTIWORD_SYNONYMS;
    }
    
$cmd = array('cmd' => XS_CMD_QUERY_PARSEFLAG'arg' => $flag);
    
$this->execCommand($cmd);
    return 
$this;
}

開啟自動同義詞搜索功能

setCharset() 方法
public XSSearch setCharset(string $charset)
$charset string
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L69 (顯示)
public function setCharset($charset)
{
    
$this->_charset strtoupper($charset);
    if (
$this->_charset == 'UTF8') {
        
$this->_charset 'UTF-8';
    }
    return 
$this;
}

設置字符集 默認字符集是 UTF-8, 如果您提交的搜索語句和預期得到的搜索結果為其它字符集, 請先設置

setCollapse() 方法
public XSSearch setCollapse(string $field, int $num=1)
$field string 依據該字段的值折疊搜索結果, 設為 null 則取消折疊
$num int 折疊后只是返最匹配的數據數量, 默認為 1, 最大值 255
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L393 (顯示)
public function setCollapse($field$num 1)
{
    
$vno $field === null XSFieldScheme::MIXED_VNO $this->xs->getField($fieldtrue)->vno;
    
$max min(255intval($num));

    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_COLLAPSE$max$vno);
    
$this->execCommand($cmd);
    return 
$this;
}

設置折疊搜索結果 注意, 每當調用 setDbaddDb 修改當前數據庫時會重置此項設置

setCutOff() 方法
public XSSearch setCutOff(int $percent, float $weight=0)
$percent int 剔除匹配百分比低于此值的文檔, 值范圍 0-100
$weight float 剔除權重低于此值的文檔, 值范圍 0.1-25.5, 0 表示不剔除
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L98 (顯示)
public function setCutOff($percent$weight 0)
{
    
$percent max(0min(100intval($percent)));
    
$weight max(0, (intval($weight 10) & 255));
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_CUTOFF$percent$weight);
    
$this->execCommand($cmd);
    return 
$this;
}

設置百分比/權重剔除參數 通常是在開啟 setFuzzy 或使用 OR 連接搜索語句時才需要設置此項

參見

setDb() 方法
public XSSearch setDb(string $name)
$name string
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L538 (顯示)
public function setDb($name)
{
    
$name strval($name);
    
$this->execCommand(array('cmd' => XS_CMD_SEARCH_SET_DB'buf' => strval($name)));
    
$this->_lastDb $this->_curDb;
    
$this->_lastDbs $this->_curDbs;
    
$this->_curDb $name;
    
$this->_curDbs = array();
    return 
$this;
}

設置要搜索的數據庫名 若未設置, 使用默認數據庫, 數據庫必須位于服務端用戶目錄下 對于遠程數據庫, 請使用 stub 文件來支持

setDocOrder() 方法
public XSSearch setDocOrder(bool $asc=false)
$asc bool 是否為正序排列, 即從先到后, 默認為反序
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L378 (顯示)
public function setDocOrder($asc false)
{
    
$type XS_CMD_SORT_TYPE_DOCID | ($asc XS_CMD_SORT_FLAG_ASCENDING 0);
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORT$type);
    
$this->execCommand($cmd);
    return 
$this;
}

設置結果按索引入庫先后排序 注意, 此項排序不影響相關排序, 權重高的仍會在前面, 主要適合用于布爾檢索

setFacets() 方法 (自版本 v1.1.0 起可用)
public XSSearch setFacets(mixed $field, bool $exact=false)
$field mixed 要進行分組統計的字段或字段組成的數組, 最多同時支持 8 個
$exact bool 是否要求絕對精確搜索, 這會造成較大的系統開銷
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L464 (顯示)
public function setFacets($field$exact false)
{
    
$buf '';
    if (!
is_array($field)) {
        
$field = array($field);
    }
    foreach (
$field as $name) {
        
$ff $this->xs->getField($name);
        if (
$ff->type !== XSFieldMeta::TYPE_STRING) {
            throw new 
XSException("Field `$name' cann't be used for facets search, can only be string type");
        }
        
$buf .= chr($ff->vno);
    }
    
$cmd = array('cmd' => XS_CMD_SEARCH_SET_FACETS'buf' => $buf);
    
$cmd['arg1'] = $exact === true 0;
    
$this->execCommand($cmd);
    return 
$this;
}

設置分面搜索記數 用于記錄匹配搜索結果中按字段值分組的數量統計, 每次調用 search 后會還原設置 對于多次調用 $exact 參數以最后一次為準, 只支持字段值不超過 255 字節的情況

自 v1.4.10 起自動對空值的字段按 term 分面統計(相當于多值)

setFuzzy() 方法
public XSSearch setFuzzy(bool $value=true)
$value bool 設為 true 表示開啟模糊搜索, 設為 false 關閉模糊搜索
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L84 (顯示)
public function setFuzzy($value true)
{
    
$this->_defaultOp $value === true XS_CMD_QUERY_OP_OR XS_CMD_QUERY_OP_AND;
    return 
$this;
}

開啟模糊搜索 默認情況只返回包含所有搜索詞的記錄, 通過本方法可以獲得更多搜索結果

setGeodistSort() 方法 (自版本 v1.4.10 起可用)
public XSSearch setGeodistSort(array $fields, bool $reverse=false, bool $relevance_first=false)
$fields array 在此定義地理位置信息原點坐標信息,數組至少必須包含2個值
$reverse bool 是否由遠及近排序, 默認為由近及遠
$relevance_first bool 是否優先相關性排序, 默認為否
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L266 (顯示)
public function setGeodistSort($fields$reverse false$relevance_first false)
{
    if (!
is_array($fields) || count($fields) < 2) {
        throw new 
XSException("Fields of `setGeodistSort' should be an array contain two or more elements");
    }
    
// [vno][vlen][vbuf] ...
    
$buf '';
    foreach (
$fields as $key => $value) {
        
$field $this->xs->getField($keytrue);
        if (!
$field->isNumeric()) {
            throw new 
XSException("Type of GeoField `$key' shoud be numeric");
        }
        
$vno $field->vno;
        
$vbuf strval(floatval($value));
        
$vlen strlen($vbuf);
        if (
$vlen >= 255) {
            throw new 
XSException("Value of `$key' too long");
        }
        
$buf .= chr($vno) . chr($vlen) . $vbuf;
    }
    
$type XS_CMD_SORT_TYPE_GEODIST;
    if (
$relevance_first) {
        
$type |= XS_CMD_SORT_FLAG_RELEVANCE;
    }
    if (!
$reverse) {
        
$type |= XS_CMD_SORT_FLAG_ASCENDING;
    }
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORT$type0$buf);
    
$this->execCommand($cmd);
    return 
$this;
}

設置地理位置距離排序方式

請務必先以 numeric 類型字段定義經緯度坐標字段,例如用 lon 代表經度、lat 代表緯度, 那么設置排序代碼如下,必須將經度定義在前緯度在后:

$search->setGeodistSort(array('lon' => 39.18, 'lat' => 120.51));

setLimit() 方法
public XSSearch setLimit(int $limit, int $offset=0)
$limit int 數量上限, 若設為 0 則啟用默認值 self::PAGE_SIZE
$offset int 偏移量, 即跳過的結果數量, 默認為 0
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L524 (顯示)
public function setLimit($limit$offset 0)
{
    
$this->_limit intval($limit);
    
$this->_offset intval($offset);
    return 
$this;
}

設置搜索結果的數量和偏移 用于搜索結果分頁, 每次調用 search 后會還原這2個變量到初始值

setMultiSort() 方法 (自版本 v1.1.0 起可用)
public XSSearch setMultiSort(array $fields, bool $reverse=false, bool $relevance_first=false)
$fields array 排序依據的字段數組, 以字段名稱為鍵, true/false 為值表示正序或逆序
$reverse bool 是否為倒序顯示, 默認為正向, 此處和 setSort 略有不同
$relevance_first bool 是否優先相關性排序, 默認為否
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L307 (顯示)
public function setMultiSort($fields$reverse false$relevance_first false)
{
    if (!
is_array($fields)) {
        return 
$this->setSort($fields, !$reverse$relevance_first);
    }

    
// [vno][0/1] (0:reverse,1:asc)
    
$buf '';
    foreach (
$fields as $key => $value) {
        if (
is_bool($value)) {
            
$vno $this->xs->getField($keytrue)->vno;
            
$asc $value;
        } else {
            
$vno $this->xs->getField($valuetrue)->vno;
            
$asc false;
        }
        if (
$vno != XSFieldScheme::MIXED_VNO) {
            
$buf .= chr($vno) . chr($asc 0);
        }
    }
    if (
$buf !== '') {
        
$type XS_CMD_SORT_TYPE_MULTI;
        if (
$relevance_first) {
            
$type |= XS_CMD_SORT_FLAG_RELEVANCE;
        }
        if (!
$reverse) {
            
$type |= XS_CMD_SORT_FLAG_ASCENDING;
        }
        
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORT$type0$buf);
        
$this->execCommand($cmd);
    }
    return 
$this;
}

設置多字段組合排序方式 當您需要根據多個字段的值按不同的方式綜合排序時, 請使用這項

setQuery() 方法
public XSSearch setQuery(string $query)
$query string 搜索語句, 設為 null 則清空搜索語句, 最大長度為 80 字節
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L242 (顯示)
public function setQuery($query)
{
    
$this->clearQuery();
    if (
$query !== null) {
        
$this->_query $query;
        
$this->addQueryString($query);
    }
    return 
$this;
}

設置默認搜索語句 用于不帶參數的 countsearch 以及 terms 調用 可與 addWeight 組合運用

setRequireMatchedTerm() 方法 (自版本 v1.4.8 起可用)
public XSSearch setRequireMatchedTerm(bool $value=true)
$value bool 設為 true 表示開啟返回, 設為 false 關閉該功能, 默認是不開啟
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L114 (顯示)
public function setRequireMatchedTerm($value true)
{
    
$arg1 XS_CMD_SEARCH_MISC_MATCHED_TERM;
    
$arg2 $value === true 0;
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_MISC$arg1$arg2);
    
$this->execCommand($cmd);
    return 
$this;
}

設置在搜索結果文檔中返回匹配詞表 請在 search 前調用本方法, 然后使用 XSDocument::matched 獲取

setScwsMulti() 方法 (自版本 v1.4.7 起可用)
public XSSearch setScwsMulti(int $level)
$level int 要設置的分詞復合等級
{return} XSSearch 返回自身對象以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L507 (顯示)
public function setScwsMulti($level)
{
    
$level intval($level);
    if (
$level >= && $level 16) {
        
$cmd = array('cmd' => XS_CMD_SEARCH_SCWS_SET'arg1' => XS_CMD_SCWS_SET_MULTI'arg2' => $level);
        
$this->execCommand($cmd);
    }
    return 
$this;
}

設置當前搜索語句的分詞復合等級 復合等級是 scws 分詞粒度控制的一個重要參數, 是長詞細分處理依據, 默認為 3, 值范圍 0~15 注意: 這個設置僅直對本次搜索有效, 僅對設置之后的 setQuery 起作用, 由于 query 設計的方式問題, 目前無法支持搜索語句單字切分, 但您可以在模糊檢索時設為 0 來關閉復合分詞

setSort() 方法
public XSSearch setSort(string $field, bool $asc=false, bool $relevance_first=false)
$field string 依據指定字段的值排序, 設為 null 則用默認順序
$asc bool 是否為正序排列, 即從小到大, 從少到多, 默認為反序
$relevance_first bool 是否優先相關性排序, 默認為否
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L350 (顯示)
public function setSort($field$asc false$relevance_first false)
{
    if (
is_array($field)) {
        return 
$this->setMultiSort($field$asc$relevance_first);
    }
    if (
$field === null) {
        
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORTXS_CMD_SORT_TYPE_RELEVANCE);
    } else {
        
$type XS_CMD_SORT_TYPE_VALUE;
        if (
$relevance_first) {
            
$type |= XS_CMD_SORT_FLAG_RELEVANCE;
        }
        if (
$asc) {
            
$type |= XS_CMD_SORT_FLAG_ASCENDING;
        }
        
$vno $this->xs->getField($fieldtrue)->vno;
        
$cmd = new XSCommand(XS_CMD_SEARCH_SET_SORT$type$vno);
    }
    
$this->execCommand($cmd);
    return 
$this;
}

設置搜索結果的排序方式 注意, 每當調用 setDbaddDb 修改當前數據庫時會重置排序設定 此函數第一參數的用法與 setMultiSort 兼容, 即也可以用該方法實現多字段排序

setSynonymScale() 方法 (自版本 v1.4.7 起可用)
public XSSearch setSynonymScale(float $value)
$value float 取值范圍 0.01-2.55, 1 表示不調整
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L162 (顯示)
public function setSynonymScale($value)
{
    
$arg1 XS_CMD_SEARCH_MISC_SYN_SCALE;
    
$arg2 max(0, (intval($value 100) & 255));
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_MISC$arg1$arg2);
    
$this->execCommand($cmd);
    return 
$this;
}

設置同義詞搜索的權重比例

setWeightingScheme() 方法 (自版本 v1.4.11 起可用)
public XSSearch setWeightingScheme(int $scheme)
$scheme int 匹配權重方案
{return} XSSearch 返回對象本身以支持串接操作
源碼: sdk/php/lib/XSSearch.class.php#L130 (顯示)
public function setWeightingScheme($scheme) {
    
$arg1 XS_CMD_SEARCH_MISC_WEIGHT_SCHEME;
    
$arg2 intval($scheme);
    
$cmd = new XSCommand(XS_CMD_SEARCH_SET_MISC$arg1$arg2);
    
$this->execCommand($cmd);
    return 
$this;
}

設置檢索匹配的權重方案 目前支持三種權重方案: 0=BM25/1=Bool/2=Trad

terms() 方法
public array terms(string $query=NULL, bool $convert=true)
$query string 搜索語句, 若傳入 null 使用默認語句, 最大長度為 80 字節
$convert bool 是否進行編碼轉換, 默認為 true
{return} array 可用于高亮顯示的詞條列表
源碼: sdk/php/lib/XSSearch.class.php#L578 (顯示)
public function terms($query null$convert true)
{
    
$query $query === null '' $this->preQueryString($query);

    if (
$query === '' && $this->_terms !== null) {
        
$ret $this->_terms;
    } else {
        
$cmd = new XSCommand(XS_CMD_QUERY_GET_TERMS0$this->_defaultOp$query);
        
$res $this->execCommand($cmdXS_CMD_OK_QUERY_TERMS);
        
$ret = array();

        
$tmps explode(' '$res->buf);
        for (
$i 0$i count($tmps); $i++) {
            if (
$tmps[$i] === '' || strpos($tmps[$i], ':') !== false) {
                continue;
            }
            
$ret[] = $tmps[$i];
        }
        if (
$query === '') {
            
$this->_terms $ret;
        }
    }
    return 
$convert XS::convert($ret$this->_charset'UTF-8') : $ret;
}

獲取搜索語句中的高亮詞條列表

2條評論!

#130 報告
warrior at 2018-06-15 15:22:59
setGeodistSort()與setSort()如何能完美結合

當我需要將一堆數據按照距離從近到遠的順序排序時,由于使用setLimit()獲取,可能由于索引刷新,造成個別數據重復出現在兩次分頁中,所以想使用主鍵排序,然后再去拉取數據。但是,發現以上兩個函數無法完美結合。

#116 報告
帥帥小哥 at 2017-10-18 10:54:56
setScwsMulti() 方法

值范圍 0~15 注意: 這個設置僅直對本次搜索有效, 只對本次搜索有效

請到論壇 登錄 后刷新本頁面!

青海快三开奖走势图_ 排列7最大一注多少钱 代理 加拿大快8开奖能作弊吗 11139排列3 美的股票 江西快3走势图360 杭州股票融资 黑龙江20选8走势图表 排三现场直播视频 上市公司增发股票融资