實踐中 XunSearch(訊搜)更新索引方案對比

来源:http://www.cnblogs.com/yifenghong/archive/2017/02/07/6372492.html
-Advertisement-
Play Games

檢測PHP-SDK的運行條件(查看是否支持XunSearch) $prefix/sdk/php/util/RequiredCheck.php $prefix #替換成你的安裝目錄 使用 XunSearch(訊搜)有很多種使用方法 和 更新索引的方法; 搜索語法• 查詢語句和流行的搜索引擎相似,通過空 ...


檢測PHP-SDK的運行條件(查看是否支持XunSearch)   $prefix/sdk/php/util/RequiredCheck.php $prefix #替換成你的安裝目錄

 

使用 XunSearch(訊搜)有很多種使用方法  和 更新索引的方法;

搜索語法
• 查詢語句和流行的搜索引擎相似,通過空格把搜索詞、句連接起來即可,欄位檢索使用 field:XXX 的格式。
• 允許使用 AND/OR/NOT/XOR  等顯式地布爾關係組合,可以使用小括弧 () 包圍表達優先順序。
• 支持使用雙引號對較長搜索詞進行精確匹配,要求欄位設計時勾選“精確”項。
   $search->search(‘ 杭州 西湖’); //  搜索同時包含這2個詞的結果
   $search->search(‘ 杭州 OR  西湖’); //  搜索包含其中一個詞的結果
   $search->search(‘subject:杭州 西湖’); //  包括西湖並且標題包含杭州的結果
獲取結果
• 設置數量及偏移
   $search->setLimit(5, 15);  //  設置最多返回 5 條,並跳過前 15 條,即返回第 16-20 條結果
• 獲取搜索結果

 

$docs = $search->setQuery(‘ 測試’)->search();  //  搜索 ‘ 測試’
   foreach ($docs as $doc) {
       $subject = $search->highlight($doc->subject); //  高亮處理標題
       echo $doc->rank() . ‘. ‘ . $subject . ‘ [‘ . $doc->percent() . ‘%] - ‘ . date(‘Y-m-d’) . “n”;
       echo $doc->message . “nn”;
   }

 

 • 獲取搜索結果數量 ( 估算值)

   $count = $search->getLastCount(); //  獲取最後一次 $search->search()  的匹配數量
   $count = $search->count(‘測試’); //  直接檢索包含 ‘ 測試’  的數量 

 

熱門搜索 
    通過 XSSearch::getHotQuery  方法獲取熱門搜索詞,返回的數組以關鍵詞為鍵名,搜索指數為值。
     $words = $search->getHotQuery(); //  獲取前 6 個總熱門搜索詞
     $words = $search->getHotQuery(6, ‘lastnum’); //  獲取前 10 個上周熱門詞 
  相關搜索 
    通過 XSSearch::getRelatedQuery  方法獲取熱門搜索詞,返回相關搜索片語成的數組。
     $words = $search->getRelatedQuery(); //  獲取前 6 個和最近一次 setQuery()  相關的搜索詞
     $words = $search->getRelatedQuery(‘測試’, 10);  //  獲取 10 個和 ‘ 測試’  相關的搜索詞
   搜索糾錯 
    由於輸入過快或拼音輸入中文很容易出現錯誤,XSSearch::getCorrectedQuery 方法返回糾正後的關鍵片語成的數組。     

    $docs = $search->setQuery(‘ 側試’)->search();  //  正常進行搜索誤打的 ‘ 側試’
       $corrected = $search->getCorrectedQuery(); //  嘗試修正
      if (count($corrected) > 0) { // 有修正詞則列出
         echo “ 您是不是要找:n”;
         foreach ($corredted as $word) echo $word . “n”;
     }    
 	 
  搜索建議
    類似常見搜索引擎那樣,當用戶在輸入框鍵入少量字、拼音、聲母時進行智能補全,可以節省用戶的輸入時間。
     $words = $search->getExpandedQuery(‘c’); //  返回 array(‘ 測試’)
     $words = $search->getExpandedQuery(‘ 測’); //  返回 array(‘ 測試’)

      $words = $search->getExpandedQuery(‘cs’);  //  返回 array(‘ 測試’)

 

附加XunSearch搜索結果code

 

#引入介面文件,其實你懂的,就是一個類
require './lib/XS.php';   //  引入 xunsearch sdk
if(isset($_POST['sub']) && $_POST['keyword'] != ''){
     $keyword = trim($_POST['keyword']);    //接收關鍵詞
     $xs = new XS('source');    // demo  為項目名稱,配置文件是:$sdk/app/demo.in i
      //$index = $xs->index;   //  獲取索引對象
      $search = $xs->search;   //  獲取搜索對象
      $search->setLimit(20); 
      $docs = $search->setQuery( $keyword)->search();  //  搜索 ‘ 測試’    
     echo "<table border='1' bordercolor='green' cellspacing='0'><tr><th>標題</th></tr>";
      foreach ($docs as $doc) {
               $subject = $search->highlight($doc->product_name); //  高亮處理標題
            echo "<tr><td>".$subject."</td></tr>";
      }
       echo "</table>";  

     // $search->setQuery($keyword);
     // 獲取前 6 個和預設搜索語句 "西湖" 相關搜索詞
    // $words = $search->getRelatedQuery();
    // print_r($words);     

 

最常見的就有批量更新和增量更新索引,話不多說,直接看代碼;

====================   單獨更新索引  ==========================

1-  添加文檔   (就是直接添加單條數據記錄到索引庫中)

$xs = new XS('njw');
$index = $xs->index;
$data = array(
'pid' => 234, // 此欄位為主鍵,必須指定
'subject' => '測試文檔的標題',
'message' => '測試文檔的內容部分',
'chrono' => time()
);
//創建文檔對象
$doc = new XSDocument;
$doc->setFields($data);
​//添加到索引資料庫中
$index->add($doc);

  

2- 更新文檔 (其中$data里必須包含有主鍵欄位,這樣索引庫才會被更新成功)

$xs = new XS('njw');
$index = $xs->index;
$data = array(
'pid' => 234, // 此欄位為主鍵,必須指定
'subject' => '測試文檔的標題',
'message' => '測試文檔的內容部分',
'chrono' => time()
);
//創建文檔對象
$doc = new XSDocument;
$doc->setFields($data);
//更新到索引資料庫中
$index->update($doc);


附加其它索引操作說明:
   $index->add($doc);  //  添加文檔,不檢測便索引庫內是否已有同一主鍵數據    $index->update($doc); //  更新文檔,若有同主鍵數據則替換之    $index->del(‘123’); //  刪除主鍵值為 234 的文檔    $index->del(array(‘123’,‘456’)); //  刪除主鍵值為 123 及 456 的文檔


  

================  批量更新  ===================

 

3- 平滑批量重建更新索引 (批量更新索引,)

header('Content-Type:text/html;charset=utf-8;');
require_once '../../../local/xunsearch/sdk/php/lib/XS.php';
include "./mysql_conn.php";
try{
$xs = new XS('njw');
//平滑重建索引
//宣佈開始重建索引
$xs->index->beginRebuild();
$sql = "select g.id id,g.title title,g.norms norms,i.picture picture from b2b_goods g INNER JOIN b2b_goods_images i ON g.id=i.goods_id limit";
$result = $db->query($sql);
while( $row = $result -> fetch_assoc ()) {
$doc = new XSDocument;
$doc->setFields($row);
//添加到索引資料庫中
$xs->index->add($doc);
$xs->index->update($doc);
}
//告訴伺服器重建索引完成
$xs->index->endRebuild();
}catch(XSException $e){
echo $e;
}

  

4 - 使用緩衝區批量重建更新索引 (批量更新操作)

header('Content-Type:text/html;charset=utf-8;');
require_once '../../../local/xunsearch/sdk/php/lib/XS.php';
include "./mysql_conn.php";
try{
    $xs = new XS('njw');
    //使用索引緩衝區
    $xs->index->openBuffer();
    $sql = "select g.id id,g.title title,g.norms norms,i.picture picture from b2b_goods g INNER JOIN b2b_goods_images i ON g.id=i.goods_id";
    $result = $db->query($sql);
    while( $row = $result -> fetch_assoc ()) {
        $doc = new XSDocument;
        $doc->setFields($row);
        //添加到索引資料庫中
        $xs->index->add($doc);
        $xs->index->update($doc);
    }
    //告訴伺服器重建索引完成
    $xs->index->closeBuffer();
}catch(XSException $e){
    echo $e;
}

  

清空索引和索引同步

當搜索欄位文件變更或出現嚴重不同步時,建議清空索引。

 
 // 當搜索欄位文件變更或出現嚴重不同步時,建議清空索引。
 $index->clean(); //  一執行立即生效

   
索引同步
出於性能優化設計,上面所看到的索引操作都是非同步操作。也就是說您通過 PHP  調用的 API 返回後,索引變動是先保存在服務端的隊列中,由服務端根據負荷延遲一併寫入索引庫。這個時間差我們控制在合理範圍內,通常是幾秒鐘時間。但如果您在批量更新後希望立即同步,可以這樣:

$index->flushIndex();

   


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、如果主伺服器出現問題,可以快速切換到從伺服器。 2、對與實時性要求不高或者更新不頻繁的應用可以在從伺服器上執行查詢操作,降低主伺服器的訪問壓力。將數據的讀寫進行分離從而達到負載的效果。 3、可以在從伺服器進行數據備份操作,以避免備份期間對主伺服器的影響。 ...
  • 昨天測試環境的Hbase啟動有問題,日誌中顯示: transaction type: 1 error: KeeperErrorCode = NoNode for /hbase hmaster等其他進程日誌中顯示連接不上zookeeper,發現zookeeper啟動有問題。 於是判斷可能是zookee ...
  • 使用Elastic Search分析器,集成結巴分詞插件,並同時支持同義詞、字元映射等功能。 ...
  • 當 sp_executesql 或 EXECUTE 語句執行字元串時,字元串將作為它的自包含批處理執行。SQL Server 會將字元串中的一個或多個 Transact-SQL 語句編譯為獨立於批處理(包含 sp_executesql 或 EXECUTE 語句)執行計劃的執行計劃。 跟許可權有什麼關係 ...
  • 1、 " 插入語句 " 1.1、 "INSERT" 1.2、 "INSERT ALL" 2、 " 刪除語句 " 2.1、 "DELETE" 2.2、 "TRUNCATE" 3、 " 更新語句 " 3.1、 "UPDATE" 3.2、 "帶子查詢的 UPDATE" 3.3、 "一次更新多個欄位的 UP ...
  • 遠程連接MySQL資料庫時,陸陸續續遇到了一些雜七雜八的問題,相信很多人也曾經遇到過這類問題,下麵總結歸納在下麵,方便以後直接查找。 1:出現ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (111) [r... ...
  • 游標允許應用程式對查詢語句select 返回的行結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作; 它還提供對基於游標位置而對錶中數據進行刪除或更新的能力 但是 ,處理大數據量時,效率低下,占用記憶體大 ;能不用儘量不用 例子 declare @id varchar(50) d ...
  • 寫在前面:索引對查詢的速度有著至關重要的影響,理解索引也是進行資料庫性能調優的起點。考慮如下情況,假設資料庫中一個表有10^6條記錄,DBMS的頁面大小為4K,並存儲100條記錄。如果沒有索引,查詢將對整個表進行掃描,最壞的情況下,如果所有數據頁都不在記憶體,需要讀取10^4個頁面,如果這10^4個頁 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...