搜索概述

2019-08-14 14:11 更新

在索引庫建立完成后,現(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; // 獲取 搜索對象

Info: 搜索對象內(nèi)置了字符集智能轉(zhuǎn)換,如果您使用的字符集和項目默認的字符集 XS::defaultCharset 不一致,請調(diào)用 XSSearch::setCharset 在開始其它搜索前設(shè)置正確的字符集。

2. 典型搜索做法

一個典型的搜索基本流程是把構(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ù)估算值

Tip: 除了調(diào)用 XSSearch::search 獲取搜索結(jié)果外,在某些情況我們可能只想知道結(jié)果的命中數(shù)量, 那么可以直接調(diào)用 XSSearch::count 來獲取。但要指出的是,這個結(jié)果計數(shù)只是一個估算值。

3. 關(guān)于快捷搜索

除了上述的典型搜索方式外,我們還提供一種稱為快捷搜索的方式。其實就是直接將 query 語句作為參數(shù)傳遞給相應(yīng)的 API 調(diào)用 XSSearch::count 和 XSSSearch::search。由于不經(jīng)過 setQuery 因此有些其它輔助的功能受到 限制,比如不能進行結(jié)果高亮、不能通過 addWeight、addRange 增加輔助搜索條件。

$count = $search->count('項目測試'); 
$docs = $search->search('項目測試');
4. 搜索中的串接操作

由于 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();
5. 搜索日志

在每一次正常搜索之后,系統(tǒng)內(nèi)部均對相應(yīng)的關(guān)鍵詞做了記錄和一并分析。但這個行為并不是實時的, 而是積累一定的量后再統(tǒng)一分析和處理。

搜索日志保存在 $prefix/項目名/log_db 中,它是一個獨立的索引庫,通過它實現(xiàn)了包括相關(guān)搜索、 拼音搜索、糾錯建議等功能。

Tip: 如果您需要強制同步搜索日志庫,請參見 Indexer 索引管理工具 的 --flush-log 選項。
此外,只有當您的搜索代碼中調(diào)用了 XSSearch::setQuery 并配合不帶參數(shù)的 XSSearch::search 調(diào)用, 才會記錄本次搜索關(guān)鍵詞。

6. 如何進行多庫搜索?

在索引概述中我們曾經(jīng)提到,如果您的索引數(shù)據(jù)量非常大,那么應(yīng)當適當 考慮分割數(shù)據(jù),在服務(wù)端采用多個庫來保存索引數(shù)據(jù)。您可以調(diào)用 XSSearch::addDb 添加 其它搜索庫。

關(guān)于超大數(shù)據(jù)量的多庫搜索及分布式設(shè)計,由于涉及的知識和范圍比較廣。我們提供了專門的商業(yè)支持方案, 在論壇中也會開辟專門的討論,在此略過不述。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號