在索引庫建立完成后,現(xiàn)在開始學習使用搜索功能,這也是最核心的部分。
1. 如何開始使用搜索?在 PHP-SDK
中,搜索功能由類型為 XSSearch 的對象所維護。在 XS 項目中,通過讀取 XS::search 屬性來獲取搜索操作對象,然后展開使用,而不是自行創(chuàng)建對象。后面章節(jié)中的 相關(guān)測試代碼如果沒有特別編寫,其中的$search
均為通過類似以下的方式獲取的索引對象:
require '$prefix/sdk/php/lib/XS.php';$xs = new XS('demo'); // 建立 XS 對象,項目名稱為:demo$search = $xs->search; // 獲取 搜索對象
2. 典型搜索做法Info: 搜索對象內(nèi)置了字符集智能轉(zhuǎn)換,如果您使用的字符集和項目默認的字符集 XS::defaultCharset 不一致,請調(diào)用 XSSearch::setCharset 在開始其它搜索前設(shè)置正確的字符集。
一個典型的搜索基本流程是把構(gòu)建好的搜索語句,通過合適的 API
進行必要的修飾, 再傳遞給底層的搜索服務(wù)器進行處理,然后把匹配的結(jié)果返回。具體包括以下步驟:
構(gòu)建搜索查詢語句 query
,然后調(diào)用 XSSearch::setQuery 設(shè)定它
根據(jù)需要設(shè)置附加的查詢條件:通過 XSSearch::addWeight 干擾排名權(quán)重, 通過 XSSearch::addRange 添加字段搜索區(qū)間或范圍, 通過 XSSearch::setFuzzy 開啟模糊匹配,以獲取更多搜索結(jié)果
進行必要的搜索結(jié)果限定:通過 XSSearch::setLimit 設(shè)置搜索結(jié)果數(shù)量和偏移, 通過 XSSearch::setSort 設(shè)置搜索結(jié)果的排序方式,等等
執(zhí)行搜索,并獲取搜索結(jié)果,關(guān)于搜索結(jié)果的處理詳見后面的章節(jié)
代碼如下:
$query = '項目測試'; // 這里的搜索語句很簡單,就一個短語
$search->setQuery($query); // 設(shè)置搜索語句
$search->addWeight('subject', 'xunsearch'); // 增加附加條件:提升標題中包含 'xunsearch' 的記錄的權(quán)重
$search->setLimit(5, 10); // 設(shè)置返回結(jié)果最多為 5 條,并跳過前 10 條
$docs = $search->search(); // 執(zhí)行搜索,將搜索結(jié)果文檔保存在 $docs 數(shù)組中
$count = $search->count(); // 獲取搜索結(jié)果的匹配總數(shù)估算值
3. 關(guān)于快捷搜索Tip: 除了調(diào)用 XSSearch::search 獲取搜索結(jié)果外,在某些情況我們可能只想知道結(jié)果的命中數(shù)量, 那么可以直接調(diào)用 XSSearch::count 來獲取。但要指出的是,這個結(jié)果計數(shù)只是一個估算值。
除了上述的典型搜索方式外,我們還提供一種稱為快捷搜索的方式。其實就是直接將 query
語句作為參數(shù)傳遞給相應(yīng)的 API
調(diào)用 XSSearch::count 和 XSSSearch::search。由于不經(jīng)過 setQuery
因此有些其它輔助的功能受到 限制,比如不能進行結(jié)果高亮、不能通過 addWeight
、addRange
增加輔助搜索條件。
$count = $search->count('項目測試'); $docs = $search->search('項目測試');
由于 Xunsearch PHP-SDK
全面采用面向?qū)ο蟮木幊趟枷耄谒阉鲗ο笾袑Σ糠炙阉髡Z句構(gòu)建、 搜索結(jié)果修飾加入了串接操作支持。支持串接操作的方法有:
addDB($name)
- 用于多庫搜索,添加數(shù)據(jù)庫名稱
addRange($field, $from, $to)
- 添加搜索過濾區(qū)間或范圍
addWeight($field, $term)
- 添加權(quán)重索引詞
setCharset($charset)
- 設(shè)置字符集
setCollapse($field, $num = 1)
- 設(shè)置搜索結(jié)果按字段值折疊
setDb($name)
- 設(shè)置搜索庫名稱,默認則為 db
setFuzzy()
- 設(shè)置開啟模糊搜索, 傳入?yún)?shù) false 可關(guān)閉模糊搜索
setLimit($limit, $offset = 0)
- 設(shè)置搜索結(jié)果返回的數(shù)量和偏移
setQuery($query)
- 設(shè)置搜索語句
setSort($field, $asc = false)
- 設(shè)置搜索結(jié)果按字段值排序
如果采用串接操作,那么上面的搜索語句可以改寫如下,有種一氣呵成的感覺:
$docs = $search->setQuery('項目測試')->addWeight('subject', 'xunsearch')->setLimit(5, 10)->search();
在每一次正常搜索之后,系統(tǒng)內(nèi)部均對相應(yīng)的關(guān)鍵詞做了記錄和一并分析。但這個行為并不是實時的, 而是積累一定的量后再統(tǒng)一分析和處理。
搜索日志保存在 $prefix/項目名/log_db
中,它是一個獨立的索引庫,通過它實現(xiàn)了包括相關(guān)搜索、 拼音搜索、糾錯建議等功能。
6. 如何進行多庫搜索?Tip: 如果您需要強制同步搜索日志庫,請參見 Indexer 索引管理工具 的
--flush-log
選項。
此外,只有當您的搜索代碼中調(diào)用了 XSSearch::setQuery 并配合不帶參數(shù)的 XSSearch::search 調(diào)用, 才會記錄本次搜索關(guān)鍵詞。
在索引概述中我們曾經(jīng)提到,如果您的索引數(shù)據(jù)量非常大,那么應(yīng)當適當 考慮分割數(shù)據(jù),在服務(wù)端采用多個庫來保存索引數(shù)據(jù)。您可以調(diào)用 XSSearch::addDb 添加 其它搜索庫。
關(guān)于超大數(shù)據(jù)量的多庫搜索及分布式設(shè)計,由于涉及的知識和范圍比較廣。我們提供了專門的商業(yè)支持方案, 在論壇中也會開辟專門的討論,在此略過不述。
更多建議: