Advanced Object Search bundle provides advanced object search in Pimcore backend powered by Elasticsearch v6/v7.
- Installer creates all necessary tables.
- Before starting, setup following configurations in symfony configuration tree:
advanced_object_search:
# Prefix for index names
index_name_prefix: 'advanced_object_search_'
# List of elasticsearch hosts
es_hosts:
- 'localhost'
- call Pimcore command
advanced-object-search:update-mapping
for creating mappings andadvanced-object-search:re-index
for indexing data for the first time.
GUI for creating searches against ES index with
- saving functionality
- sharing functionality
Following event listeners are called automatically
pimcore.dataobject.postUpdate
- data object is updated in ES index, all child objects are added to update queue.pimcore.dataobject.preDelete
- data object is deleted from ES index.pimcore.class.postUpdate
- ES index mapping is updated or index recreated if necessary.
Functions in Pimcore console.
advanced-object-search:process-update-queue
--> processes whole update queue of es search index.advanced-object-search:re-index
--> Reindex all data objects of given class. Does not delete index first or resets update queue.advanced-object-search:update-mapping
--> Deletes and recreates mapping of given classes. Resets update queue for given class.
For details see documentation directly in Pimcore console.
By default, with every Pimcore maintenance call, 500 entries of update queue are processed. As an alternative, you also can activate symfony messenger to process the update queue. For that, just activate it as follows.
advanced_object_search:
messenger_queue_processing:
activated: true
If activated, the processing is kicked off automatically with the advancedobjectsearch_update_queue
maintenance task.
Messages are dispatched via pimcore_index_queues
transport. So make sure, you have
workers processing this transport when activating the messenger based queue processing.
Per data object class one index with one document type is created.
<?php
/**
* @var \AdvancedObjectSearchBundle\Service $service
*/
$service = $this->get("AdvancedObjectSearchBundle\Service");
$service->updateMapping(ClassDefinition::getByName("Product"));
On data object save or via script:
<?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)
],
""
);
Currently following data types are not supported - but can be added if needed in future versions:
- ClassificationStore
- Slider
- Password
- Block
- Table
- StructuredTable
- Geographic data types
- Image data types
- Implement Field Definition Adapter by implementing the
IFieldDefinitionAdapter
interface. - Register new Field Definition Adapter as service
- Add mapping in configuration like
advanced_object_search:
field_definition_adapters:
newDataTypeName: SERVICE_ID_OF_FIELD_DEFINITION_ADAPTER
If you want custom filters in the result tab directly without having to create a new advanced object search every time read here on how to extend the result tab with custom filters..
- ElasticSearch 6
- ElasticSearch 7
- Reinstall of Bundle might be necessary - due to switch to MigrationInstaller.
- Update ES mapping and reindex is necessary - run commands
advanced-object-search:update-mapping
andadvanced-object-search:re-index
.
- Removed BC Layer for old configuration file. Configuration now only in symfony configuration tree.
- Removed deprecated
IFieldDefinitionAdapter
, useFieldDefinitionAdapterInterface
instead. - Data in Elasticsearch might be different, so recheck if you are depending directly on the data in Elasticsearch.
- Execute all migrations of the bundle.
- Update to latest (allowed) bundle version in Pimcore 6.9 and execute all migrations.
- Make sure you are using ElsaticSearch 7.
- Then update to Pimcore X.