如何在Symfony 5中使用Elasticsearch 7和FOSElasticaBundle创建搜索引擎

了解如何使用 Elasticsearch 轻松创建搜索引擎功能以搜索你的数据库实体。

如何在Symfony 5中使用Elasticsearch 7和FOSElasticaBundle创建搜索引擎

文章图片
如何创建搜索引擎
【如何在Symfony 5中使用Elasticsearch 7和FOSElasticaBundle创建搜索引擎】Elasticsearch 是一种有用的工具,可让你快速实时地存储、搜索和分析大量数据,并在几毫秒内提供答案。你可以将 Elasticsearch 视为可以处理 JSON 请求并根据你的参数返回 JSON 数据的服务器。Elasticsearch 对于严重依赖搜索平台来访问、检索和报告数据以及有效和准确搜索的应用程序非常有用。
如何在Symfony创建搜索引擎?在本文中,我将向你解释如何在你的 Symfony 5 项目中与你的 Elasticsearch 服务器进行交互。
要求为了阅读本文,我们假设你已经启动并运行了一个 Elasticsearch 服务器。在我们的例子中,我们将使用通过 Docker 运行并在http://localhost:9200/.
记住这一点,让我们开始学习本教程。
1. 安装 FOSElasticaBundleSymfony创建搜索引擎的方法:为了与 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,实体如下所示:
< ?phpnamespace 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”匹配的文章:
如何在Symfony 5中使用Elasticsearch 7和FOSElasticaBundle创建搜索引擎

文章图片
Symfony创建搜索引擎的方法
Elasticsearch 和 Elastica 的文档非常广泛,所以不要忘记查看文档以获取有关如何在 Symfony 5 应用程序中与 Elasticsearch 交互的更高级示例。
快乐编码??!

    推荐阅读