becklyn/search-bundle

使用 Elasticsearch 简单自动地为您的 Symfony 项目提供动力。

安装: 985

依赖者: 0

建议者: 0

安全: 0

星标: 6

观察者: 4

分支: 4

开放问题: 3

类型:symfony-bundle

2.0.0 2022-12-12 10:43 UTC

This package is auto-updated.

Last update: 2024-09-20 15:47:13 UTC


README

安装

  1. 首先通过 composer 安装包

    composer require becklyn/search-bundle
  2. 在您的 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