Ted's Blog



小白如何使用 迅搜(xunsearch)


闲来无事打算把博客的搜索功能加上便于日后的文章搜索

在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来。这个时候查询的效率就显得很重要!

所以我们打算使用分词中间件来提高搜索的效率和友好性

分词中间件有 sphinx、coreseek、xunsearch、solr等

此次为了达到简单学习及装逼的效果我们使用Xunsearch举例

1、Xunsearch是什么?

Xunsearch 是一个高性能、全功能的全文检索工具。

Xunsearch 旨在帮助一般开发者针对既有的海量数据,快速而方便地建立自己的全文搜索引擎。

Xunsearch 中文译名为“迅搜”,代码中的经常被缩写为 XS,既是英文名称的缩略也是中文声母缩写。 这儿的“迅”是快速的意思,至少包含了两层涵义:其一代表了搜索结果的响应能力,其二则为二次开发难度、速度。

2、需要了解Xunsearch 工作原理 及 使用流程

    1. Xunsearch 原理官网有

    2. 流程:安装Xunsearch -> 引入SDK包 -> 创建索引 -> 关键字分词 -> 搜索索引数据 -> 干你想干的 -> End


3、源代码实例

索引操作方法

/**
* 索引操作 仅供参考
*/
public function actionXunsearch($act){

        try {

            // 定义配置文件地址 (ini文件设计辅助工具 http://www.xunsearch.com/tools/iniconfig)
            define('XS_APP_ROOT',dirname(dirname(__DIR__)).'/common/config');

            $xs = new \XS('demo'); // demo 为项目名称,配置文件是:$sdk/app/demo.ini
            $index = $xs->index; // 获取索引对象

            if($act == 'create-index'){

                //清空索引
                $index->clean();
                echo 'clean index successful'."<br/>";
                
                $list = "查询数据 Array";
                if($list){

                    $doc = new \XSDocument; // 创建文档对象
                    foreach ($list as $_k=>$_v){

                        $doc->setFields([    //创建 XSDocument
                            'id'    =>  $_v['id'],
                            'title' =>  $_v['title'],
                            'content'   =>  '',
                        ]);
                        // 添加文档,不检测便索引库内是否已有同一主键数据
                        $index->update($doc)
                        echo 'insert index successful :'.$_v['id']."<br/>";

                    }
                    //告诉服务器重建索引完成
                    $index->endRebuild();

                    $index->flushIndex();
                    echo 'flush index successful';
                }

            }elseif ($act == 'clean-index'){        //清空索引
                $index->clean(); // 一执行立即生效
                echo 'clean index successful';

            }elseif ($act == 'flush-index'){        //同步索引
                $index->flushIndex();
                echo 'flush index successful';
            }

           
        } catch (XSException $e) {
            echo $e . "\n" . $e->getTraceAsString() . "\n"; // 发生异常,输出描述
        }
    }


查询方法

//模糊查询 (Xunsearch 分词)
    if(!empty($where['keyword'])){

        $xs = new \XS('demo'); // demo 为项目名称,配置文件是:$sdk/app/demo.ini

        $tokenizer = new \XSTokenizerScws;   // 直接创建分词Scws实例
        $words = $tokenizer->getResult($where['keyword']);

        $query = 'title:'.implode(' OR ',array_column($words,'word'));
        $search = $xs->search; // 获取搜索对象


        $search->setQuery($query);  // 设置搜索语句
//      $search->setLimit(2, 0); // 设置返回结果最多为 5 条,并跳过前 10 条
        $docs = $search->setFuzzy()->search();      //setFuzzy() 模糊搜索

        $ids = [];
        if($docs){
            foreach ($docs as $_k=>$_v){
                $ids[] = $_v->id;
            }
        }

    }


4、总结

索引可以通过定时任务重建索引 也可以实时的单条更新索引 官方提供了Indexers索引管理器



本文操作仅为简单基础操作 更多功能请参考官方文档


分享:

写评论


Contact ME

github:https://github.com/tebie6

email:liumingyuphp@163.com

友情链接

无敌我大鑫哥:http://dream128.cn