了解如何使用 Elasticsearch 轻松创建搜索引擎功能以搜索你的数据库实体。
Elasticsearch 是一种有用的工具,可让你快速实时地存储、搜索和分析大量数据,并在几毫秒内提供答案。你可以将 Elasticsearch 视为可以处理 JSON 请求并根据你的参数返回 JSON 数据的服务器。Elasticsearch 对于严重依赖搜索平台来访问、检索和报告数据以及有效和准确搜索的应用程序非常有用。
如何在Symfony创建搜索引擎?在本文中,我将向你解释如何在你的 Symfony 5 项目中与你的 Elasticsearch 服务器进行交互。
要求
为了阅读本文,我们假设你已经启动并运行了一个 Elasticsearch 服务器。在我们的例子中,我们将使用通过 Docker 运行并在http://localhost:9200/
.
记住这一点,让我们开始学习本教程。
1. 安装 FOSElasticaBundle
Symfony创建搜索引擎的方法:为了与 Symfony 中的 Elasticsearch 服务器进行交互,最好的方法是通过 FOSElasticaBundle。此捆绑包可帮助你:
- 将 Elastica 库集成到 Symfony 环境中(Elastica 本身就是 Elasticsearch 的 PHP 客户端)。
- 使用 JmsSerializer 或 Symfony Serializer 在 PHP 对象和 Elasticsearch 数据之间进行转换。
- 为Elasticsearch配置索引,或者不用配置发送数据使用Elasticsearch的动态映射特性
- 用于自动索引的 Doctrine 事件监听器
迄今为止,对 Elasticsearch v7 的支持仅在 FOSElasticaBundle (v6.0.0-beta3) 的测试版中可用。要安装此版本,请运行以下命令(请注意,到目前为止,v6 版本尚不可用,如果可用,请改为安装该版本):
composer require friendsofsymfony/elastica-bundle v6.0.0-beta3
安装完成后,继续进行配置步骤。有关此捆绑包的更多信息,请在此处访问 Github 上的官方存储库。
2. 配置访问地址
在你的 .env 文件中,你将找到一个新属性,该属性将指示 Elasticsearch 的端点:
# project/.env
###> friendsofsymfony/elastica-bundle ###
ELASTICSEARCH_URL=http://localhost:9200/
###< friendsofsymfony/elastica-bundle ###
如果不是,请定义它并将其值替换为访问端点。
3. 创建示例实体
如何创建搜索引擎?本例中搜索引擎的思想是用给定的关键字搜索一些文章。文章存储在 MySQL 数据库中,Doctrine 用作 ORM,实体如下所示:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Articles
*
* @ORM\Table(name="articles")
* @ORM\Entity(repositoryClass="App\Repository\ArticlesRepository")
*/
class Articles
{
/**
* @var int
*
* @ORM\Column(name="id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, nullable=false)
*/
private $name;
/**
* @var string
*
* @ORM\Column(name="slug", type="string", length=255, nullable=false)
*/
private $slug;
/**
* @var string|null
*
* @ORM\Column(name="preview", type="string", length=255, nullable=true, options={"default"="NULL"})
*/
private $preview;
/**
* @var string
*
* @ORM\Column(name="content", type="text", length=0, nullable=false)
*/
private $content;
/**
* @var string|null
*
* @ORM\Column(name="tags", type="string", length=255, nullable=true, options={"default"="NULL"})
*/
private $tags;
}
稍后将通过指示此实体将文章填充到 Elasticsearch 中。确保在你的数据库中保留了一些文章。
4. 配置索引
如何在Symfony创建搜索引擎?在 Elasticsearch 中,索引可以被视为文档的优化集合,每个文档都是字段的集合,字段是包含数据的键值对。默认情况下,Elasticsearch 索引每个字段中的所有数据,每个索引字段都有一个专用的、优化的数据结构。在这种情况下,我们可以为文章实体创建一个索引,将定义的属性存储在我的实体中,使用文章实体作为模型。你可以fos_elastica.yaml
像这样在文件中定义所有索引:
# app/config/packages/fos_elastica.yaml
# Read the documentation: https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/doc/setup.md
fos_elastica:
clients:
default: { url: '%env(ELASTICSEARCH_URL)%' }
indexes:
articles:
properties:
name: ~
slug: ~
preview: ~
content: ~
tags: ~
persistence:
driver: orm
model: App\Entity\Articles
5. 创建索引
现在,你需要在 Elasticsearch 中创建索引。这可以通过运行以下命令轻松完成:
php bin/console fos:elastica:create
6. 填充数据
最后,你可以运行以下命令在 Elasticsearch 中填充表的信息:
php bin/console fos:elastica:populate
这将生成类似于以下的输出:
Resetting articles
0/1480 [>---------------------------] 0%
200/1480 [===>------------------------] 13%
300/1480 [=====>----------------------] 20%
500/1480 [=========>------------------] 33%
600/1480 [===========>----------------] 40%
800/1480 [===============>------------] 54%
900/1480 [=================>----------] 60%
1100/1480 [====================>-------] 74%
1200/1480 [======================>-----] 81%
1400/1480 [==========================>-] 94%
1480/1480 [============================] 100%
Populating articles Refreshing articles
如你所见,在我的数据库的文章表中,有 1480 个文章实体现已在 Elasticsearch 中建立索引,因此我们现在可以在 Symfony 项目的控制器或服务中的引擎上运行一些查询。
7.注册查找器
如何创建搜索引擎?你可以通过多种方式通过 Elastica 在 Elasticsearch 中运行某些查询,你可以在此页面上查看有关它们的详细信息。在此示例中,我们将继续进行最基本的示例,以便你稍后可以研究更多有关高级搜索的信息。
Symfony创建搜索引擎的方法:你需要做的第一件事是在你的services.yaml
. 根据你的需要,你可以在单个控制器或服务上注册 finder,如下所示:
# app/config/services.yaml
App\Controller\ExampleController:
tags: [controller.service_arguments]
bind:
# replace "articles" with the name of your index
# and replace the class of the Finder
FOS\ElasticaBundle\Finder\TransformedFinder $articlesFinder: '@fos_elastica.finder.articles'
所以你只能在特定的控制器中获取服务:
<?php
// app/src/Controller/ExampleController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use FOS\ElasticaBundle\Finder\TransformedFinder;
use Elastica\Util;
class ExampleController extends AbstractController
{
public function someAction(TransformedFinder $articlesFinder) : Response
{
// do something with $articlesFinder
}
}
或者,你可以在任何需要的地方绑定查找器:
# app/config/services.yaml
services:
_defaults:
# replace "articles" with the name of your index
# and replace the class of the Finder
bind:
FOS\ElasticaBundle\Finder\TransformedFinder $articlesFinder: '@fos_elastica.finder.articles'
8. 运行搜索
如何在Symfony创建搜索引擎?作为最后一步,你现在可以测试是否一切都按预期运行一些查询。此示例将对文章索引运行查询,并将返回与你的搜索词匹配的所有实体。在这种情况下,它将在控制器内运行:
<?php
// app/src/Controller/ExampleController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use FOS\ElasticaBundle\Finder\TransformedFinder;
use Elastica\Util;
class ExampleController extends AbstractController
{
public function someAction(TransformedFinder $articlesFinder) : Response
{
$search = Util::escapeTerm("Bleu de channel parfum");
$result = $articlesFinder->findHybrid($search, 10);
dump($result);
return $this->render("views/empty.html.twig");
}
}
转储的内容如下所示,因此所有与搜索“Bleu de channel parfum”匹配的文章:
Elasticsearch 和 Elastica 的文档非常广泛,所以不要忘记查看文档以获取有关如何在 Symfony 5 应用程序中与 Elasticsearch 交互的更高级示例。
快乐编码❤️!