pimcore/advanced-object-search

安装次数: 135,454

依赖: 0

建议者: 0

安全: 0

星标: 39

关注者: 15

分支: 44

开放问题: 16

类型:pimcore-bundle


README

通过OpenSearch实现的Pimcore高级对象搜索

高级对象搜索组件为Pimcore后端提供了由OpenSearch支持的高级对象搜索功能。

Pimcore集成

安装和配置

遵循安装说明

配置OpenSearch客户端

OpenSearch客户端配置通过Pimcore OpenSearch客户端组件进行,分为两个部分。

  1. 配置OpenSearch客户端。
  2. 定义高级对象搜索使用的客户端。
# Configure an OpenSearch client 
pimcore_open_search_client:
    clients:
        default:
            hosts: ['https://opensearch:9200']
            password: 'admin'
            username: 'admin'
            ssl_verification: false


# Define the client to be used by advanced object search
advanced_object_search:
    client_name: default  # default is default value here, just need to be specified when other client should be used.

如果未进行配置,则默认使用连接到localhost:9200的客户端。

配置高级对象搜索

在开始之前,至少在symfony配置树中设置以下配置

advanced_object_search:
    # Prefix for index names
    index_name_prefix: 'advanced_object_search_'

有关更多配置选项,请参阅文档和配置树的内置说明。

初始索引

调用Pimcore命令advanced-object-search:update-mapping以创建映射,并调用advanced-object-search:re-index以第一次索引数据。

图形用户界面

通过图形用户界面创建搜索索引,具有

  • 保存功能
  • 共享功能

Screen

插件钩子

以下事件监听器会自动调用

  • pimcore.dataobject.postUpdate - 数据对象在搜索索引中更新,所有子对象被添加到更新队列。
  • pimcore.dataobject.preDelete - 数据对象从搜索索引中删除。
  • pimcore.class.postUpdate - 更新搜索索引映射或必要时重新创建索引。

Pimcore控制台

Pimcore控制台中的功能。

  • advanced-object-search:process-update-queue --> 处理es搜索索引的整个更新队列。
  • advanced-object-search:re-index --> 重新索引给定类中的所有数据对象。不会先删除索引或重置更新队列。
  • advanced-object-search:update-mapping --> 删除并重新创建给定类的映射。重置给定类的更新队列。

有关详细信息,请直接在Pimcore控制台中查看文档。

Pimcore维护 & Symfony Messenger

默认情况下,每次调用Pimcore维护时,都会处理更新队列中的500个条目。作为替代方案,您还可以激活symfony messenger以处理更新队列。为此,只需按照以下方式激活它。

 advanced_object_search:
    messenger_queue_processing:
        activated: true

如果激活,则会自动通过advancedobjectsearch_update_queue维护任务启动处理。

消息通过pimcore_index_queues传输。因此,在激活基于messenger的队列处理时,请确保您有处理此传输的worker。

API方法

为数据对象类创建映射

为每个数据对象类创建一个索引和一个文档类型。

<?php
/**
* @var \AdvancedObjectSearchBundle\Service $service
 */
$service = $this->get("AdvancedObjectSearchBundle\Service");
$service->updateMapping(ClassDefinition::getByName("Product"));

更新索引数据

在数据对象保存或通过脚本

<?php
/**
* @var \AdvancedObjectSearchBundle\Service $service
 */
$service = $this->get("AdvancedObjectSearchBundle\Service");

$objects = Product::getList();
foreach($objects as $object) {
    $service->doUpdateIndexData($object);
}

搜索/过滤数据

<?php
/**
* @var \AdvancedObjectSearchBundle\Service $service
 */
$service = $this->get("AdvancedObjectSearchBundle\Service");

//filter for relations via ID
$results = $service->doFilter(3,
    [
        new FilterEntry(
            "objects",
            [
                "type" => "object",
                "id" => 75
            ],
            BoolQuery::SHOULD
        )
    ],
    ""
);



//filter for relations via sub query
$results = $service->doFilter(3,
    [
        [
            "fieldname" => "objects",
            "filterEntryData" => [
                "type" => "object",
                "className" => "Customer",
                "filters" => [
                    [
                        "fieldname" => "firstname",
                        "filterEntryData" => "tom"
                    ]
                ]
            ]
        ],

    ],
    ""
);


// full text search query without filters
$results = $service->doFilter(3,
    [],
    "sony"
);


// filter for several attributes - e.g. number field, input, localized fields
$results = $service->doFilter(3,
    [
        [
            "fieldname" => "price",
            "filterEntryData" => 50.77
        ],
        [
            "fieldname" => "price2",
            "filterEntryData" => [
                "gte" => 50.77,
                "lte" => 50.77
            ]
        ],
        [
            "fieldname" => "keywords",
            "filterEntryData" => "test2",
            "operator" => BoolQuery::SHOULD
        ],
        [
            "fieldname" => "localizedfields",
            "filterEntryData" => [
                "en" => [
                    "fieldname" => "locname",
                    "filterEntryData" => "englname"
                ]
            ]
        ],
        [
            "fieldname" => "localizedfields",
            "filterEntryData" => [
                "de" => [
                    "fieldname" => "locname",
                    "filterEntryData" => "deutname"                
                ]
            ]
        ],
        new FilterEntry("keywords", "testx", BoolQuery::SHOULD)
    ],
    ""
);

不支持的数据类型

目前以下数据类型不受支持 - 但可以在未来版本中添加

  • ClassificationStore
  • 滑动条
  • 密码
  • 表格
  • 结构化表格
  • 地理数据类型
  • 图像数据类型

集成新数据类型

  • 通过实现IFieldDefinitionAdapter接口来实现字段定义适配器。
  • 将新的字段定义适配器注册为服务
  • 在配置中添加映射,例如
advanced_object_search: 
    field_definition_adapters:
        newDataTypeName: SERVICE_ID_OF_FIELD_DEFINITION_ADAPTER

在结果选项卡中扩展过滤器

如果您想在结果选项卡中直接使用自定义过滤器而无需每次都创建新的高级对象搜索,请阅读此处关于如何使用自定义过滤器扩展结果选项卡的说明