best-served-cold / laravel-zendsearch
Laravel 的 ZendSearch 实现 - 基于本地文件的搜索引擎
Requires
- php: >=5.6.4
- illuminate/support: ^5.3
- zendframework/zendsearch: ^2.0@RC
Requires (Dev)
- orchestra/testbench: ^3.3
- phpunit/phpunit: ^4.8
- squizlabs/php_codesniffer: ^2.7
README
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 添加选项传递
- 添加高亮选项