• 实践中 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();
    

       

  • 相关阅读:
    Tencent 闲聊对话机器人接口调用,画像:设计员小白
    logging模块简介python
    jieba分词的几种形式
    h5py这个坑-PyCharm Process finished with exit code -1073741819 (0xC0000005)
    python之six模块的用法six.py2 six.py3
    Swoole从入门到入土(8)——协程初探
    Swoole从入门到入土(7)——TCP服务器[大杂烩]
    Swoole从入门到入土(6)——TCP服务器[粘包]
    Swoole从入门到入土(5)——TCP服务器[异步任务]
    Swoole从入门到入土(4)——TCP服务器[正确重启]
  • 原文地址:https://www.cnblogs.com/yifenghong/p/6372492.html
Copyright © 2020-2023  润新知