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

2021年11月29日20:14:20 发表评论 586 次浏览

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

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

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”匹配的文章:

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

Elasticsearch 和 Elastica 的文档非常广泛,所以不要忘记查看文档以获取有关如何在 Symfony 5 应用程序中与 Elasticsearch 交互的更高级示例。

快乐编码❤️!

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: