了解如何使用 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 事件监听器
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”匹配的文章:
文章图片
快乐编码??!
推荐阅读
- 如何将SVG字符串渲染到画布(并导出为PNG或JPEG)
- 电脑公司win7镜像纯净版免费下载
- sony专用win7系统免费下载
- 雨林木风win7纯净版64gho免费下载
- 联想专用win7旗舰版32位免费下载
- 雨林木风w7纯净版免费下载
- 雨林木风win7x64旗舰版免费下载
- 联想笔记本win7系统64位原版免费下载
- 雨林木风windows 7旗舰版32免费下载