Laravel Elasticsearch教程。完整指南

146 阅读5分钟

Elasticsearch using Elasticquent in Laravel

Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式的,具有多租户能力的全文搜索引擎,有一个HTTP网络接口和无模式的JSON文档。

Laravel Elasticsearch

要在Laravel中使用Elasticsearch,请使用Elasticquent 包。 ElasticquentElasticquent包通过将**ElasticsearchEloquent** 模型映射到Elasticsearch类型,使其工作更容易。

你可以使用默认设置或在模型中定义Elasticsearch应该如何索引和搜索你的Eloquent模型。Elasticquent允许你采取一个Eloquent模型,并在Elasticsearch中快速索引和搜索其内容。

在这个例子中,我们首先在mac上安装Elasticsearch,并设置好laravel开发环境。

第一步:在Mac上安装Elasticsearch。

如果你之前没有在mac上安装Elasticsearch ,那么你需要这个步骤。否则,你可以跳过这一步。相反,在终端输入以下cmd,通过homebrew安装Elasticsearch

brew install elasticsearch

它将安装它,现在使用以下命令启动服务。

brew services start elasticsearch

第2步:设置Laravel和Elasticsearch环境。

通过下面的命令安装Laravel 5.6

laravel new elasticlaravel

进入项目文件夹。

cd elasticlaravel

在你的编辑器中打开这个项目.

code .

在**.env** 文件中配置数据库.

composer.json 文件中加入以下一行。我们正在安装Elasticquent 软件包。

"require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.6.*",
        "laravel/tinker": "^1.0",
        "elasticquent/elasticquent": "dev-master"
    },

输入下面的命令来安装elasticquent包。

composer update

Laravel Elasticsearch Tutorial Example

一旦你运行composer更新 命令,你必须在你的config/app.php 文件中注册Laravel服务提供者。

// config/app.php

'providers' => [
    ...
    Elasticquent\ElasticquentServiceProvider::class,
],

我们还提供了一个elasticsearch-php 客户端的facade(使用我们的设置进行连接);如果有必要,在你的 config/app.php中添加以下内容 。

// config/app.php

'aliases' => [
    ...
    'Es' => Elasticquent\ElasticquentElasticsearchFacade::class,
],

Elasticsearch配置

键入以下Artisan命令,将配置文件发布到你的Laravel 5.6的配置目录。

php artisan vendor:publish --provider="Elasticquent\ElasticquentServiceProvider"

现在进入配置文件:app >> config >> elastiquent.php

我们需要为我们的应用程序添加索引名称。所以,让我们从默认改为文章

<?php

// elastiquent.php

return array(

    /*
    |--------------------------------------------------------------------------
    | Custom Elasticsearch Client Configuration
    |--------------------------------------------------------------------------
    |
    | This array will be passed to the Elasticsearch client.
    | See configuration options here:
    |
    | http://www.elasticsearch.org/guide/en/elasticsearch/client/php-api/current/_configuration.html
    */

    'config' => [
        'hosts'     => ['localhost:9200'],
        'retries'   => 1,
    ],

    /*
    |--------------------------------------------------------------------------
    | Default Index Name
    |--------------------------------------------------------------------------
    |
    | This is the index name that Elasticquent will use for all
    | Elasticquent models.
    */

    'default_index' => 'articles',

);

第3步:创建一个文章模型和迁移。

我们将使用elasticsearch搜索文章。例如,使用以下命令来创建一个模型和迁移。

php artisan make:model Article -m

在你的**_create_articles_table.php**文件中,添加模式代码。

// create_articles_table.php

public function up()
{
   Schema::create('articles', function (Blueprint $table) {
       $table->increments('id');
       $table->string('title');
       $table->text('body');
       $table->string('tags');
       $table->timestamps();
   });
}

使用下面的命令迁移该表。

php artisan migrate

第四步:创建虚拟数据。

使用下面的命令创建一个ArticleTableSeeder

php artisan make:seeder ArticleTableSeeder

为了生成假数据,我们使用Faker库。然而,在此之前,我们需要在Article.php 文件内添加受保护的**$fillable字段以防止大量赋值异常。**

// Article.php

class Article extends Model
{
    protected $fillable = ['title', 'body', 'tags'];
}

现在,在ArticleTableSeeder.php 文件中添加以下代码。

<?php

// ArticleTableSeeder.php

use Illuminate\Database\Seeder;
use App\Article;

class ArticleTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $faker = Faker\Factory::create();

        for($i=0; $i<50; $i++) {
          Article::create([
            'title' => $faker->sentence(3),
            'body' => $faker->paragraph(6),
            'tags' => join(',', $faker->words(4))
          ]);
        }
    }
}

DatabaseSeeder.php 文件中添加ArticleTableSeeder 类,该文件位于同一目录中。

<?php

// DatabaseSeeder.php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(ArticleTableSeeder::class);
    }
}

现在运行播种机并使用以下命令创建假数据。

php artisan db:seed

Elasticsearch in Laravel

第5步:在Article模型内设置Elastiquent。

Article.php 文件中写下以下代码。

<?php

// Article.php

namespace App;
use Elasticquent\ElasticquentTrait;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use ElasticquentTrait;

    protected $fillable = ['title', 'body', 'tags'];

    protected $mappingProperties = array(
        'title' => [
          'type' => 'text',
          "analyzer" => "standard",
        ],
        'body' => [
          'type' => 'text',
          "analyzer" => "standard",
        ],
        'tags' => [
          'type' => 'text',
          "analyzer" => "standard",
        ],
      );
}

在这里,我们为ElasticSearch添加我们的映射配置。该数据库表有三个主要字段。所以我们需要指定类型和分析器,在我们的例子中是标准。记住,我们的索引 名称是文章。 mappingProperties 数组是需要用适当的类型进行索引的字段,以便搜索和获得完美的结果。

每个映射都有一个类型和一个分析器。类型的可以是各种数据类型,包括字符串、数字和日期。我们将坚持使用文本类型,但要注意,不同的类型允许你利用不同的东西。你可以在elasticsearch的原始文档中找到更多的数据类型。

好了,现在我们需要对数据库进行索引。所以在web.php 文件里面,写下以下代码。记住,我把 下面的 代码写 在web.php 文件里,但在实时情况下 ,你需要把它写在控制器或任何其他应用程序的逻辑部分,除了web.php 文件。

索引文件

要索引一个Eloquent模型中的所有条目,请使用。addAllToIndex

    Article::addAllToIndex();

你也可以为一个模型集合建立索引。

    $articles = Article::where('id', '<', 200)->get();
    $articles->addToIndex();

你也可以对单个条目进行索引。

    $articles = Article::find($id);
    $articles->addToIndex();

你也可以重新索引整个模型。

     Article::reindex()

现在,我们对整个模型进行索引,在 路径里面写索引代码**。**

<?php

// web.php

use App\Article;

Route::get('/', function () {
    Article::createIndex($shards = null, $replicas = null);

    Article::putMapping($ignoreConflicts = true);

    Article::addAllToIndex();

    return view('welcome');
});

在这里,我们已经创建了索引。索引的名字已经在config >> elastiquent.php 文件中定义。

然后,我们把定义在Article.php 模型中的映射,最后,把 它添加 到索引中。

进入浏览器,点击这个网址**:elasticlaravel.test/**

你会得到欢迎页面,但是我们的数据已经完全被索引了,我们可以通过使用cURL 发送以下请求来验证**。** 我们也可以使用postman,但我是通过终端发送请求的。

curl 'localhost:9200/articles/_mapping?pretty'

Elastic search api for laravel with example

我们可以用下面的命令做一个基本的搜索。

curl 'localhost:9200/articles/articles/_search?q=title:Sed&pretty'

在这里,我们对标题的搜索词是Sed。 所以它将获取有Sed 术语的记录。我们可以在终端里面看到prettify的结果。

Laravel Elasticsearch query example

第6步: 使用Laravel的口才方法进行搜索.

好的, 到目前为止, 我们已经使用cURL 来搜索数据.现在, 我们将使用Elastiquent 方法来搜索数据.所以让我们在web.php 文件中创建另一个路由,并添加以下代码。

<?php

// Article.php

use App\Article;

Route::get('/', function () {
    Article::createIndex($shards = null, $replicas = null);

    Article::putMapping($ignoreConflicts = true);

    Article::addAllToIndex();

    return view('welcome');
});

Route::get('/search', function() {

    $articles = Article::searchByQuery(['match' => ['title' => 'Sed']]);

    return $articles;
});

我把**'Sed'** 硬编码,但在实时应用程序中,它将是我们在搜索框中输入的搜索词。现在,切换到这个URL**:elasticlaravel.test/search。**你可…

Search using elasticsearch in Laravel

当然,你可能会得到不同的数据,因为它是随机生成的。因此,首先检查数据库,挑选术语,然后把它传递给搜索引擎,它将返回这样的数据。所以我们已经成功地对数据进行了索引,并从elasticsearch引擎中获取了数据。

在这个例子中,我们搜索了标题,你也可以去搜索正文标签

$articles = Article::searchByQuery(['match' => ['body' => 'eligendi']]);
    
return $articles;

而且你也可以对标签 做同样的处理。

搜索集合

我们可以用下面的代码得到总的点击率来计算。

$articles = Article::searchByQuery(['match' => ['title' => 'Heleium']]);
    
 return $articles->totalHits();

访问shards数组。

 $articles->shards();

访问最大得分。

 $articles->maxScore();

访问timed out布尔属性。

 $articles->timedOut();

访问采取的属性。

  $articles->took();

访问搜索聚合--详见聚合

$articles->getAggregations();

拉威尔过滤器

The postLaravel Elasticsearch Tutorial:完整的指南首次出现在AppDividend上。