linshunwei/laravel-xunsearch

中文全文搜索 xunsearch

2.0.1 2020-12-23 02:24 UTC

This package is auto-updated.

Last update: 2021-04-23 03:07:34 UTC


README

介绍

这个包是在 laravel/scout 的服务中添加拓展,使用 XunSearch 搜索 功能。

XunSearch 的安装,具体查看 XunSearch 的官方文档

laravel/scout 的安装和使用,查看 laravel/scout 的官方文档

安装

使用 composer

composer require linshunwei/xunsearch-laravel

在配置文件中添加服务提供者(Laravel5.5 有自动添加)

'providers' => [
    //...
    Linshunwei\XunSearchLaravel\XunSearchServiceProvider::class,
    //...
],

复制配置文件到配置目录,配置文件内容不多,而且可以在 .env 文件中设置。手动复制或者使用命令复制:

php artisan vendor:publish --provider="Linshunwei\XunSearchLaravel\XunSearchServiceProvider"

修改 scout 配置文件 config/scout.php,让 scout 使用 XunSearch 引擎

    'driver' => env('SCOUT_DRIVER', 'xunsearch'),

或者直接在 .env 文件中设置

SCOUT_DRIVER=xunsearch

修改 XunSearch 配置文件 config/xunsearch.php

    'server_host' => env('XUNSEARCH_SERVER_HOST', '127.0.0.1'),
    'server_index_port' => env('XUNSEARCH_SERVER_INDEX_PORT', '8383'),
    'server_search_port' => env('XUNSEARCH_SERVER_SEARCH_PORT', '8384'),
    'default_charset' => env('XUNSEARCH_DEFAULT_CHARSET', 'utf-8'),

或者直接在 .env 文件中设置需要修改的内容,没有特殊情况默认即可

XUNSEARCH_SERVER_HOST=127.0.0.1

使用

Model 中使用搜索功能,先引入 Searchable Trait,详见 Scout 使用文档

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class Article extends Model
{
    use Searchable;

要使用 XunSearch, Model 还要实现指定接口,同时如果有需要,可以使用 XunSearchTrait Trait (Trait 中注册了范围检索方法 range 和清空所有数据方法 cleanSearchable)。 实现接口需要添加 xunSearchFieldsType 方法进行字段类型设置

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
use Linshunwei\XunSearchLaravel\Contracts\XunSearch as XunSearchContract;
use Linshunwei\XunSearchLaravel\XunSearchTrait;

class Article extends Model implements XunSearchContract
{
    use Searchable, XunSearchTrait;
    
    public function xunSearchFieldsType()
    {
        return [
            'id' => [
                'type'=>self::XUNSEARCH_TYPE_NUMERIC,
            ],
            'title' => [
                'type'=>self::XUNSEARCH_TYPE_TITLE,
            ],
            'body' => [
                'type'=>self::XUNSEARCH_TYPE_BODY,
            ],
            'field' => [
                'tokenizer'=>self::XUNSEARCH_TOKENIZER_XLEN,
                'tokenizer_value'=>2,
            ],
            'created_at' => [
                'type'=>self::XUNSEARCH_TYPE_DATE,
                'index'=>self::XUNSEARCH_INDEX_NONE,
            ],
        ];
    }

设置的字段类型的具体效果,查看 XunSearch 官方文档

Model 的主键,例如 id,已被默认设为引擎的文档主键。 如果需要对 id 进行区间检索,把 id 的类型设为 self::XUNSEARCH_TYPE_NUMERIC。如果不需要对 id 进行检索,可以不添加 id 字段。

字段类型 self::XUNSEARCH_TYPE_TITLEself::XUNSEARCH_TYPE_BODY 只能分别设置一次。

XunSearchTrait 中给 Scout 的 Builder 注册了 range 方法进行区间检索。除了 titlebody 特殊字段, XunSearch 默认设定字段为 string,需要进行区间检索的字段,要设为 numeric 或者 date 才能正常检索。

例如设定 id 字段为 self::XUNSEARCH_TYPE_NUMERIC,在 id 大于 20 小于等于 60 的范围内搜索 keyword

Article::search('keyword')->range('id', 20, 60)->get();

例如设定 id 字段为 self::XUNSEARCH_TYPE_NUMERIC,在 id 倒序排序搜索 keyword

Article::search('keyword')->orderBy('id', 'asc')->get(); 

字段的索引 index 和分词器 tokenizer 的设置效果,在 XunSearch 官方文档 查看。

  • XunSearchTrait 中移除 cleanSearchable 方法,请使用 Scout 中的 removeAllFromSearch 方法。

相关链接

laravel/scout

laravel/scout 文档

hightman/xs-sdk-php

XunSearch 文档