Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式的,具有多租户能力的全文搜索引擎,有一个HTTP网络接口和无模式的JSON文档。
Laravel Elasticsearch
要在Laravel中使用Elasticsearch,请使用Elasticquent 包。 ElasticquentElasticquent包通过将**Elasticsearch和Eloquent** 模型映射到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
一旦你运行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
第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'
我们可以用下面的命令做一个基本的搜索。
curl 'localhost:9200/articles/articles/_search?q=title:Sed&pretty'
在这里,我们对标题的搜索词是Sed。 所以它将获取有Sed 术语的记录。我们可以在终端里面看到prettify的结果。
第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。**你可…
当然,你可能会得到不同的数据,因为它是随机生成的。因此,首先检查数据库,挑选术语,然后把它传递给搜索引擎,它将返回这样的数据。所以我们已经成功地对数据进行了索引,并从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上。