安装php依赖包:

composer require hightman/xunsearch

composer require laravel/scout="7.2.1"

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

开始配置:

SCOUT_DRIVER=xunsearch
XUNSEARCH_HOST=192.168.91.158
SCOUT_PREFIX=
SCOUT_QUEUE=false

demo.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
use App\Services\XunSearchEngine;

class Demo extends Model
{
    use Searchable;
    
    protected $table='demo';
    public $timestamps = true;
    
    
    public function searchableIndexData()
    {
        $indexData = [
            'id' => $this->id,
            'title' => $this->title,
        ];
        return $indexData;
    }
    
    public function searchableUsing()
    {
        $xs = new \XS(config_path('xunsearchini/demo.ini'));
        return new XunSearchEngine($xs);
    }
    
}

XunSearchEngine.php

<?php

namespace App\Services;

use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Log;
use Laravel\Scout\Builder;

class XunSearchEngine
{
    protected $xs;

public function __construct(\XS $xs)
    {
        $this->xs = $xs;
    }

/**
     * 更新给定模型索引
     *
     * @param \Illuminate\Database\Eloquent\Collection $models
     * @return void
     * @throws \XSException
     */
    public function update($models)
    {
        if ($models->isEmpty()) {
            return;
        }

// if ($this->usesSoftDelete($models->first()) && config('scout.soft_delete', false)) {
        //     $models->each->pushSoftDeleteMetadata();
        // }
        Log::info('Update Index');
        $index = $this->xs->index;
        $models->map(function ($model) use ($index) {
            $array = $model->toSearchableArray();
            if (empty($array)) {
                return;
            }
            $doc = new \XSDocument;
//             $data = [
//                 'id' => $model->id,
//                 'title' => $model->title,
//                 'content' => $model->content,
//             ];
            $doc->setFields($model->searchableIndexData());
            $index->update($doc);
        });
        $index->flushIndex();
    }

/**
     * 从索引中移除给定模型
     *
     * @param \Illuminate\Database\Eloquent\Collection $models
     * @return void
     * @throws \XSException
     */
    public function delete($models)
    {
        $index = $this->xs->index;
        $models->map(function ($model) use ($index) {
            Log::info('Deleted:' . $model->getKey());
            $index->del($model->getKey());
        });
        $index->flushIndex();
    }

/**
     * 通过迅搜引擎执行搜索
     *
     * @param \Laravel\Scout\Builder $builder
     * @return mixed
     */
    public function search(Builder $builder)
    {
        return $this->performSearch($builder, array_filter(['hitsPerPage' => $builder->limit]));
    }

/**
     * 分页实现
     *
     * @param \Laravel\Scout\Builder $builder
     * @param int $perPage
     * @param int $page
     * @return mixed
     */
    public function paginate(Builder $builder, $perPage, $page)
    {
        return $this->performSearch($builder, [
            'hitsPerPage' => $perPage,
            'page' => $page - 1,
        ]);
    }

/**
     * 返回给定搜索结果的主键
     *
     * @param mixed $results
     * @return \Illuminate\Support\Collection
     */
    public function mapIds($results)
    {
        return collect($results)
            ->pluck('id')->values();
    }

/**
     * 将搜索结果和模型实例映射起来
     *
     * @param Builder $builder
     * @param \Illuminate\Database\Eloquent\Model $model
     * @param mixed $results
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function map(Builder $builder, $results, $model)
    {
        if (count($results) === 0) {
            return Collection::make();
        }

$keys = collect($results)
            ->pluck('id')->values()->unique()->all();
        $models = $model->getScoutModelsByIds($builder, $keys)->keyBy($model->getKeyName());
        return Collection::make($results)->map(function ($hit) use ($model, $models) {
            $key = $hit['id'];
            if (isset($models[$key])) {
                return $models[$key];
            }
        })->filter();
    }

/**
     * 返回搜索结果总数
     *
     * @param mixed $results
     * @return int
     */
    public function getTotalCount($results)
    {
        return ceil($this->xs->search->getLastCount() / 2);
    }

// protected function usesSoftDelete($model)
    // {
    //     return in_array(SoftDeletes::class, class_uses_recursive($model));
    // }
    // 执行搜索功能
    protected function performSearch(Builder $builder, array $options = [])
    {
        $search = $this->xs->search;

if ($builder->callback) {
            return call_user_func(
                $builder->callback,
                $search,
                $builder->query,
                $options
            );
        }

$search->setFuzzy()->setQuery($builder->query);
        collect($builder->wheres)->map(function ($value, $key) use ($search) {
            $search->addRange($key, $value, $value);
        });

$offset = 0;
        $perPage = $options['hitsPerPage'];

if (!empty($options['page'])) {
            $offset = $perPage * $options['page'];
        }
        return $search->setLimit($perPage, $offset)->search();
    }

/**
     * 获取中文分词
     * @param $text
     * @return array
     */
    public function getScwsWords($text)
    {
        $tokenizer = new \XSTokenizerScws();
        return $tokenizer->getResult($text);
    }
}

demo.ini:

project.name = demo
project.default_charset = utf-8
server.index = 192.168.91.158:8383
server.search = 192.168.91.158:8384

[id]
type = id

[title]
type = title

XunsearchController.php

<?php

namespace App\Http\Controllers;
use App\Models\Goods;
use App\Models\Student;
use App\Models\Demo;

class XunsearchController extends Controller
{
    public function xundemo(){
        //数据有更新和插入操作,会自动更新到xunsearch中
//         $goods = new Goods();
//         $goods->title = '终于成功了';
//         $goods->content= '终于成功了';
//         $goods->save();
        
//         $student = new Student();
//         $student->title = '终于成功了';
//         $student->content= '终于成功了';
//         $student->save();

//         $demo = new Demo();
//         $demo->title = '测试';
//         $demo->content= '终于成功了';
//         $demo->save();

$keyword = '测试';
        $res = Demo::search($keyword)->paginate(20);
        dd($res);
    }
}

Xunsearch和laravel5.8的使用相关推荐

  1. Xunsearch安装和laravel5.8使用shaozeming/xunsearch-laravel扩展

    安装xunsearch: wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2 tar -xjf xunsearch ...

  2. php set medias,laravel5.1 -- Integrate FileManager and CKeditor into laravel

    FileManager中文名叫文件管理器,也叫文件浏览器,它给我们提供了一个可视化的界面来管理文件和文件夹.利用FileManager,我们可以对文件进行浏览.增加.打印.修改(文件属性).重命名.搜 ...

  3. xunsearch 迅搜初探

    2014年1月2日 19:34:12 1 [root@localhost bin]# ./php /usr/local/lamp/xunsearch/sdk/php/util/Quest.php de ...

  4. laravel5.4 关于数据填充的知识

    需求:大量excel表格数据 集中整理到一个规定数据表中,并且增加新字段做标记 步骤:把需要整理的excel表格提前存放到mysql数据库指定的表中 ,可以用图形化工具来执行! 核心:利用larave ...

  5. xunsearch mysql,如何使用xunsearch

    1 安装 1.1 安装依赖环境 apt-get install php build-essential zlib1g-dev  php-mysql -y 1.2 安装xunSearch程序 ./set ...

  6. Laravel5.5的异常捕获和处理

    一般在web开发中,我们很少会接触到除了404页面其它的http通信错误页面,即使是做404页面,我们也只是单纯的修改框架自带了404模板,很少能够做到完全的控制.但Laravel5改变了这种现状,那 ...

  7. 小白巷分享 -- Laravel5的新特性之异常处理

    小白巷分享 -- Laravel5的新特性之异常处理 参考文章: (1)小白巷分享 -- Laravel5的新特性之异常处理 (2)https://www.cnblogs.com/jroy/p/443 ...

  8. laravel5.2基础多模块开发(pingpong/modules)

    2019独角兽企业重金招聘Python工程师标准>>> 1.下载laravel5.2 http://laravelacademy.org/resources-download 2.解 ...

  9. thinkphp5是不是php,我对ThinkPHP5和Laravel5的一些看法

    本来这个是想发在新版发布贴的评论里面的,发现开源中国的评论有字数限制,所以写在这里了. 技术社区里面经常有人提到ThinkPHP5和Laravel5的优缺点,或者抄袭之类的,其实每个框架都各有优缺点 ...

最新文章

  1. 缩小sql server 日志文件
  2. 【PHP】详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI、SCRIPT_NAME、PHP_SELF区别
  3. GdiPlus[30]: IGPPen: 线帽
  4. 输出一个等边三角形(由*拼接),实心或空心,连长为n
  5. Kinect学习笔记(五)——更专业的深度图
  6. 信息学奥赛一本通 2032:【例4.18】分解质因数
  7. 互联网高并发架构的8种设计模式演化
  8. 图像形状特征(一)--FD
  9. TensorFlow基础1——神经网络tutorial
  10. MAC编译lame ld: symbol(s) not found for architecture x86_64/_lame_init_old“, referenced from
  11. Java使用lowagie根据模版动态生成PDF(无需额外设置系统字体)
  12. Ubuntu安装ffmpeg教程
  13. word2016文档怎样添加封面?简单技巧!word文档如何设置加入封面?
  14. init cloudchannel failerr:10102 - message:参数无效
  15. bilibili视频爬取与水印去除
  16. 【Web开发】Python实现Web图表功能(D-Tale入门)
  17. 用批处理的方式压缩文件
  18. final 和effectively final区别
  19. 弄明白了清华校训“自强不息 厚德载物”的来龙去脉
  20. 咖啡产品介绍PPT模板

热门文章

  1. 首届POLARDB数据库性能大赛正式收官 云原生数据库爱好者共探索技术边界...
  2. 屏幕适配Flexible.js
  3. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java杨柳农贸市场摊位管理系统qr3ri
  4. VR实景导航,解决最后几十米的导航问题
  5. Google Voice注册及初步体验
  6. c语言数组的作用是什么,C语言数组是什么
  7. matlab 传感器的迟滞,传感器的基本特性-线性度,灵敏度,重复性,迟滞,分辨率,稳定性,漂移...
  8. 未来的呼叫中心:融合通信平台
  9. Python 分布式计算
  10. iOS Podfile文件用法详解