best-served-cold/laravel-zendsearch

Laravel 的 ZendSearch 实现 - 基于本地文件的搜索引擎

1.0.6 2017-02-20 22:20 UTC

This package is not auto-updated.

Last update: 2024-09-28 19:31:19 UTC


README

Build Status Build Status Code Coverage Scrutinizer Code Quality Latest Stable Version SensioLabsInsight

LaravelZendSearch

一个快速的 ZendSearch 实现,通过 Laravel 的 Eloquent 进行连接。利用 Lucene 的强大功能,无需安装 Elasticsearch 或 Solr 等二级服务。

在使用了几个 Laravel 的 ZendSearch 包后,我对性能感到失望,因此我创建了属于自己的版本。

安装

按照以下步骤将包安装到位

设置

composer require best-served-cold/laravel-zendsearch

更新 composer,然后将 ServiceProvider 添加到 config/app.php

'providers' => [
  // ...
	BestServedCold\LaravelZendSearch\Laravel\ServiceProvider::class,
],

我对 Facades 没有太大兴趣,但如果你想使用它,请将其添加到 config/app.php 中的别名

'aliases' => [
   // ...
	'Search' => BestServedCold\LaravelZendSearch\Laravel\Facade::class,
],

发布

发布你的配置

php artisan vendor:publish

使用

索引

添加 SearchTrait 并将其用于你希望使用的模型中

// ...

use BestServedCold\LaravelZendSearch\Laravel\SearchTrait;

class User extends Model
{
    use SearchTrait;
    
// ...

然后添加方法 searchFields() 并填充你希望索引的字段

// ...
    public static function searchFields()
    {
        self::setSearchFields(['some', 'fields']);
    }
// ...

如果你想要“增强”字段,则添加以下方法

// ...
    public static function boostFields()
    {
        self::setBoostFields(['some' => 0.8, 'fields' => 1.0]);
    }
// ...

索引将自动从那里构建。

关系

如果你想要索引关系,请确保你创建了 getRelationAttribute() 方法,然后将其添加到你的模型中的 protected $appends = [$relation]; 数组中。

构建

如果你有现有数据或更改了搜索字段,你可以从头开始重建索引

php artisan search:rebuild --verbose

销毁

php artisan search:destroy --verbose

优化

php artisan search:optmise --verbose

我将在不久的将来工作在调度器上,但请确保你定期优化索引。现在,我建议你自己每小时左右安排一次。

搜索

基本

创建一个搜索实例

$search = UserModel::search();

// add your query
$search->where('string', 'field');

// add an exact match
$search->match('string', 'field');

// Search all fields
$search->where('string');

// limit your query
$search->limit(10);

// get your hits (primary keys in an array)
$ids = $search->hits();

// and or, get your eloquent collection
$result = $search->get();

// Or chain it:
$result = User::search()->where('term', 'field')->limit(15)->offset(10)->get();

删除

// Make sure you've got a collection like so
User::search()->where('term', 'field')->first()->delete();

高级

$search = UserModel::search();

// Wildcard
$search->wildcard('ter*', 'field');

// Phrase
$search->phrase('this is the phrase', 'field', [1, 2, 3, 4]);

// Fuzzy
$search->fuzzy('term', 'field');

// Term
$search->term('complete_term', 'field');

// Get the last query
BestServedCold\LaravelZendSearch\Lucene\Search::getLastQuery()->__toString();

过滤器

在配置中实现了两种基本过滤器,你可以覆盖它们,即 StopWords 和 ShortWords。然而,你可以手动更改这两个过滤器以及分析器,以预设的 ZendSearch 类或自定义类。

BestServedCold\LaravelZendSearch\Lucene\Filter::setAnalyzer(
    new ZendSearch\Lucene\Analysis\Analyzer\Common\Utf8Num\CaseInsensitive;
);

BestServedCold\LaravelZendSearch\Lucene\Filter::addFilter(
    new ZendSearch\Lucene\Analysis\TokenFilter\LowerCaseUtf8;
);

辅助工具

为了帮助调试,有一些辅助工具可以帮助你。

// Returns the last ZendSearch\Lucene\Document inserted.
var_dump(BestServedCold\LaravelZendSearch\Lucene\Store::getLastInsert());

// Returns the current set of filters or analyzer
var_dump(BestServedCold\LaravelZendSearch\Lucene::getFilters());
var_dump(BestServedCold\LaravelZendSearch\Lucene::getAnalyzer());

// Returns the last ZendSearch\Lucene\Search\Query\Boolean object to interrogate.
var_dump(BestServedCold\LaravelZendSearch\Lucene::getLastQuery()->__toString());

即将推出的功能

这是第一个稳定版本,我主要是为了在另一个项目中自己使用而制作的。不过,我将在适当的时候添加以下内容。

  • 开箱即用的计划优化
  • 为 Wildcard、Phrase 和 Fuzzy 添加选项传递
  • 添加高亮选项