wkjagt/searchable

使Laravel模型即时可搜索,并自动使用Elastic Search索引。

dev-master 2014-12-09 02:55 UTC

This package is not auto-updated.

Last update: 2024-09-10 03:14:08 UTC


README

使Laravel模型即时可搜索,并自动使用Elastic Search索引。

进行中

将搜索功能添加到Laravel模型只需使用一个特质。在模型中使用SearchableTrait将启用一个模型观察器,它会在createdupdateddeleted事件上操作,以保持您的索引更新。

特质为您的模型添加了一个search方法,使得在Elastic Search中搜索命中变得简单。

提供的门面提供了类似的功能,并增加了同时搜索多个文档类型(即模型)的能力。

安装

Composer

在您的composer文件中包含此包,然后运行composer update。

我仍在努力中,但dev-master将在我准备好一个稳定的标签后更改。

{
  "require" : {
     ...
    "wkjagt/searchable": "dev-master"
  }
}

服务提供者

将服务提供者添加到您的app.php

'providers' => [
    ...
    'Searchable\SearchableServiceProvider'
]

可搜索门面

如果您想使用可搜索门面,请将其添加到您的app.php中的别名

'aliases' => [
    ...
    'Searchable'      => 'Searchable\SearchableFacade'
]

可搜索特质

SearchableTrait添加到您要索引的模型中。例如

class Thing extends Model {

    use SearchableTrait;
    
    ...
}

这就是开始所需的所有内容。新创建的Thing模型将自动索引。默认情况下,所有模型都将添加到default索引中,完全限定的类名将用作文档类型(其中反斜杠将被点替换)。这对于正常使用来说是很好的,但可以通过在您的模型中添加静态属性来修改。

class Thing extends Model {

    use SearchableTrait;
    
    public static $searchDocumentType = 'thing';
    
    public static $searchIndexName = 'my_index';
}

搜索

搜索可以通过两种方式进行。SearchableTrait为您的模型添加了一个search方法,它接受一个参数:一个Elastic Search查询。例如

$query = [ 'filtered' => [
    'query' => [ 'match' => [ 'name' => 'some_name' ]],
    'filter' => [ 'term' => [ 'user_id' => 14 ]],
]];

$hits = Thing::search($query);

您还可以使用可搜索门面同时搜索多个模型,该门面使用原生Elastic Search方式在多个索引/文档类型中搜索。在Searchable上的搜索方法接受一个包含模型完全限定类名的数组,并需要链接到withSearch方法。例如

$query = [ 'filtered' => [
    'query' => [ 'match' => [ 'name' => 'some_name' ]],
    'filter' => [ 'term' => [ 'user_id' => 14 ]],
]];

$hits = Searchable::search(['Thing', 'OtherThing'])->withQuery($query);

结果以Searchable\SearchResult实例数组的格式返回,这些是简单的值对象,具有两个公共属性

  • hit:一个填充的Laravel模型
  • score:搜索分数

索引现有模型

当将Searchable添加到现有项目时,您可能希望索引现有的模型。添加到每个使用SearchableTrait的模型的searchable:indexall artisan命令添加了此功能。要为给定模型索引所有资源,请运行该命令,并将完全限定的类名作为参数传递,将任何反斜杠替换为正斜杠

./artisan searchable:indexall Namespace/Of/Your/Model