becklyn / search-bundle
使用 Elasticsearch 简单自动地为您的 Symfony 项目提供动力。
Requires
- php: >=8.1
- becklyn/search-text-transformer: ^2.0.0
- doctrine/common: ^3.4.2
- doctrine/doctrine-bundle: ^2.7.0
- doctrine/orm: ^2.13.4
- elasticsearch/elasticsearch: v8.5.3
- symfony/cache: ^v6.2.0
- symfony/console: v6.2.1
- symfony/dependency-injection: v6.2.1
- symfony/event-dispatcher: v6.2.0
- symfony/framework-bundle: v6.2.1
- symfony/monolog-bundle: ^v3.8.0
- symfony/property-access: ^v6.2.0
This package is auto-updated.
Last update: 2024-09-20 15:47:13 UTC
README
安装
-
首先通过 composer 安装包
composer require becklyn/search-bundle
-
在您的
AppKernel
中加载包
配置
实体注解
标记类进行索引
对于常规实体,只需用注解标记类并实现 SearchableEntityInterface
接口
use Becklyn\SearchBundle\Entity\SearchableEntityInterface; use Becklyn\SearchBundle\Mapping as Search; /** * @Search\Item() */ class SomeEntity implements SearchableEntityInterface { }
对于本地化实体,标记类并实现 LocalizedSearchableEntityInterface
接口
use Becklyn\Interfaces\LanguageInterface; use Becklyn\SearchBundle\Entity\LocalizedSearchableEntityInterface; use Becklyn\SearchBundle\Mapping as Search; /** * @Search\Item( * index="custom-index-name", * loader="some.service:method", * ) */ class LocalizedSomeEntity implements LocalizedSearchableEntityInterface { /** * @return LanguageInterface */ public function getLanguage () { } }
注意:您需要从 becklyn/interfaces
包中获取 LanguageInterface
。
@Search\Item()
注解
/** * @Search\Item( * index="custom-index-name", * loader="some.service:method", * ) */
标记字段/获取器进行索引
use Becklyn\SearchBundle\Mapping as Search; class SomeEntity { /** * @Search\Field() */ private $headline; /** * @Search\Field() */ public function getSomeData () { } }
请注意,需要有一种方法来访问受保护的 protected
/ private
属性 test
,例如通过获取器 getTest()
、isser isTest()
或 hasser hasTest()
。
@Search\Field()
注解
/** * @Search\Field( * weight=1, * fragments=null, * format="plain", * ) */
应用配置
配置位于 app/config.yml
中。
完整的配置示例
becklyn_search: server: "127.0.0.1:9200" index: "app-index-{language}" format_processors: html: "app.content.renderer" # short version pdf: # full version service: "pdf.ocr.text_extractor" html_post_process: true analyzers: analyzer_en: tokenizer: lowercase filter: - standard - lowercase - stemmer_en - asciifolding - default_filter_shingle char_filter: - filter_1 - filter_2 filters: stemmer_en: type: stemmer name: english unlocalized: analyzer: analyzer_default # a string value means that both index and search use the same analyzer localized: de: analyzer: index: analyzer_en search: analyzer_en
使用方法
搜索
只需获取 becklyn.search.client
服务并使用它进行搜索
$searchResult = $this->get("becklyn.search.client")->search( string $query, LanguageInterface $language = null, array $itemClasses = [], array $filters = [] );
该方法有三个参数
索引
您可以通过 CLI 命令、调用具体服务或使用内置的 doctrine 事件监听器自动索引实体
自动索引
由于内置的 doctrine 生命周期事件监听器,默认情况下,由 Doctrine 管理的实体在持久化/更新时会自动索引。
禁用自动索引
Becklyn\SearchBundle\Mapping\Item
注解允许您配置如何索引搜索项。默认情况下,注解的类将在 Doctrine 中持久化或更新时自动索引。
对于您不希望实体立即索引的使用场景,例如需要进一步处理时,可以将 Becklyn\SearchBundle\Mapping\Item#autoIndex
设置为 false
。这将强制 Doctrine 生命周期处理器跳过此实体的自动索引更新。
警告 这将索引实体从包的代码中转移到应用程序的代码中,通过调用 becklyn.search.indexer
。
$this->get("becklyn.search.indexer")->index(SearchableEntityInterface $entity);
或者通过运行 Symfony CLI becklyn:search:index
命令。索引命令不受此选项的影响。
手动索引
CLI 命令索引
要(重新)从 CLI 索引您的实体,becklyn/search-bundle
提供了 becklyn:search:index
命令。有关更多命令,请参阅 CLI 命令 部分。
becklyn:search:index
命令索引 所有 实体,而不管 autoIndex
设置如何。
编程索引
如果您想编程索引,只需获取 becklyn.search.indexer
服务的实例并调用 index
方法
$this->get("becklyn.search.indexer")->index(SearchableEntityInterface $entity);
修改索引数据
可以通过监听 "becklyn_search.index"
事件(或 Becklyn\SearchBundle\Event\IndexEntityEvent::EVENT
)来修改索引数据。
您的监听器将接收一个包含已序列化数据和要序列化的实体的 Becklyn\SearchBundle\Event\IndexEntityEvent
use Becklyn\SearchBundle\Event\IndexEntityEvent; public function myEventListener (IndexEntityEvent $event) { $data = $event->getData(); $entity = $event->getEntity(); if (42 === $entity->getId()) { $data["property-headline"] = "The answer to everything."; $event->setData($data); } }
目前,监听器必须知道内部字段名称,遗憾的是。这将在未来的版本中得到改进。
实体加载器
搜索项可以定义自定义实体加载器
use Becklyn\SearchBundle\Mapping as Search; /** * @Search\Item(loader="custom.service:method") */ class Example { }
如果定义了自定义加载器,则将获取服务并调用该方法。加载器语法翻译为如下调用
/** * @Search\Item(loader="custom.service:method") */ // --> will load the entities using $container->get("custom.service")->method(int[] $ids = null);
该方法必须有一个可选的数组参数。如果加载器使用null
调用,则应返回所有实体。如果加载器使用int[]
调用,则只需加载具有int
数组中id的实体。
不需要为所有提供的id加载实体,因为缺失的搜索结果将被从结果列表中删除。
加载器必须返回一个EntityLoaderResult
。
过滤
在某些情况下,搜索项应该根据除语言之外的字段进行过滤。
use Becklyn\SearchBundle\Mapping as Search; class SomeClass { /** * @Search\Filter("filter") */ public $property; /** * @Search\Filter("another-filter") */ public function method () { // ... } }
该注解有一个必需的属性:过滤器的名称。此名称需要在应用中唯一。
在搜索时,您可以使用以下方式对具有特定过滤值的结果进行过滤
$searchResult = $this->get("becklyn.search.client")->search( "some search text", $english, [], [ "filter" => "value", "another-filter" => "another value", ] );
CLI命令
该组件公开多个CLI命令。
有关每个命令的附加参数和选项,请直接查阅命令的帮助,例如php bin/console becklyn:search:client --help
。