-
Install it:
$ composer require sylius/elastic-search-plugin
-
Install elastic search server:
$ brew install elasticsearch@5.0
-
Run elastic search server:
$ elasticsearch
-
Add those bundles to
AppKernel.php
:new \ONGR\ElasticsearchBundle\ONGRElasticsearchBundle(), new \SimpleBus\SymfonyBridge\SimpleBusCommandBusBundle(), new \SimpleBus\SymfonyBridge\SimpleBusEventBusBundle(), new \ONGR\FilterManagerBundle\ONGRFilterManagerBundle(), new \Sylius\ElasticSearchPlugin\SyliusElasticSearchPlugin(),
-
Create/Setup database:
$ bin/console ongr:es:index:create $ bin/console do:da:cr $ bin/console do:sch:cr $ bin/console syl:fix:lo
If there is a problem with creating elastic search index run those commands:
$ bin/console ongr:es:index:drop --force $ bin/console ongr:es:index:create
-
Import config file in
app/config/config.yml
for default filter set configuration:imports: - { resource: "@SyliusElasticSearchPlugin/Resources/config/app/config.yml" }
For more configuration take a look at ONGRFilterManager
-
Configure ONGR bundle in
app/config/config.yml
:ongr_elasticsearch: managers: default: index: index_name: sylius mappings: SyliusElasticSearchPlugin: {} sylius_elastic_search: attribute_whitelist: ['MUG_COLLECTION_CODE', 'MUG_MATERIAL_CODE'] #Only attibutes with these codes will be indexed
-
Import routing file:
sylius_search: resource: "@SyliusElasticSearchPlugin/Resources/config/routing.yml"
-
Example Request/Response:
It's required to pass channel
argument to the search.
To activate filter you need to pass in parameter (query, request, attribute) requested field
see reference in configuration section.
For e.g:
/shop-api/taxon-products/mugs?channel=WEB_DE&price=2000;3000
It will activate taxon_slug
, price_range
and channel
filter.
Request:
/shop-api/taxon-products/mugs?channel=WEB_GB
Response:
{
"items": [
{
"code": "LOGAN_MUG_CODE",
"name": "Logan Mug",
"slug": "logan-mug",
"taxons": [
{
"code": "MUG",
"slug": "mugs",
"position": 0,
"images": [],
"description": "@string@"
}
],
"variants": [
{
"code": "LOGAN_MUG_CODE",
"name": "Logan Mug",
"price": {
"current": 1999,
"currency": "GBP"
},
"images": []
}
],
"attributes": [
{
"code": "MUG_COLLECTION_CODE",
"name": "Mug collection",
"value": "HOLIDAY COLLECTION"
},
{
"code": "MUG_MATERIAL_CODE",
"name": "Mug material",
"value": "Wood"
}
],
"images": [],
"channelCode": "WEB_GB",
"localeCode": "en_GB",
"mainTaxon": {
"code": "MUG",
"slug": "mugs",
"images": [],
"description": "@string@"
}
},
{
"code": "LOGAN_MUG_CODE",
"name": "Logan Becher",
"slug": "logan-becher",
"taxons": [
{
"code": "MUG",
"slug": "mugs",
"position": 0,
"images": [],
"description": "@string@"
}
],
"variants": [
{
"code": "LOGAN_MUG_CODE",
"name": "Logan Becher",
"price": {
"current": 1999,
"currency": "GBP"
},
"images": []
}
],
"attributes": [
{
"code": "MUG_COLLECTION_CODE",
"name": "Mug collection",
"value": "FEIERTAGSKOLLEKTION"
},
{
"code": "MUG_MATERIAL_CODE",
"name": "Mug material",
"value": "Holz"
}
],
"images": [],
"channelCode": "WEB_GB",
"localeCode": "de_DE",
"mainTaxon": {
"code": "MUG",
"slug": "mugs",
"images": [],
"description": "@string@"
}
}
],
"filters": {
"channel": {
"state": {
"active": false,
"urlParameters": [],
"name": "channel",
"options": []
},
"tags": [],
"urlParameters": {
"taxon_slug": "mugs"
},
"resetUrlParameters": {
"taxon_slug": "mugs"
},
"name": "channel",
"choices": [
{
"active": false,
"default": false,
"urlParameters": {
"taxon_slug": "mugs",
"channel": "WEB_GB"
},
"label": "WEB_GB",
"count": 2
}
]
},
"taxon_slug": {
"state": {
"active": true,
"value": "mugs",
"urlParameters": {
"taxon_slug": "mugs"
},
"name": "taxon_slug",
"options": []
},
"tags": [],
"urlParameters": {
"taxon_slug": "mugs"
},
"resetUrlParameters": [],
"name": "taxon_slug",
"choices": [
{
"active": true,
"default": false,
"urlParameters": [],
"label": "mugs",
"count": 2
},
{
"active": false,
"default": false,
"urlParameters": {
"taxon_slug": "t-shirts"
},
"label": "t-shirts",
"count": 2
}
]
},
"price_range": {
"state": {
"active": false,
"urlParameters": [],
"name": "price_range",
"options": []
},
"tags": [],
"urlParameters": {
"taxon_slug": "mugs"
},
"resetUrlParameters": {
"taxon_slug": "mugs"
},
"name": "price_range",
"minBounds": 1999,
"maxBounds": 1999
},
"locale": {
"state": {
"active": false,
"urlParameters": [],
"name": "locale",
"options": []
},
"tags": [],
"urlParameters": {
"taxon_slug": "mugs"
},
"resetUrlParameters": {
"taxon_slug": "mugs"
},
"name": "locale",
"choices": [
{
"active": false,
"default": false,
"urlParameters": {
"taxon_slug": "mugs",
"locale_code": "de_DE"
},
"label": "de_DE",
"count": 1
},
{
"active": false,
"default": false,
"urlParameters": {
"taxon_slug": "mugs",
"locale_code": "en_GB"
},
"label": "en_GB",
"count": 1
}
]
},
"attribute_values": {
"state": {
"active": false,
"urlParameters": [],
"name": "attribute_values",
"options": []
},
"tags": [],
"urlParameters": {
"taxon_slug": "mugs"
},
"resetUrlParameters": {
"taxon_slug": "mugs"
},
"name": "attribute_values",
"choices": [
{
"active": false,
"default": false,
"urlParameters": {
"taxon_slug": "mugs",
"attributeValues": [
"FEIERTAGSKOLLEKTION"
]
},
"label": "FEIERTAGSKOLLEKTION",
"count": 1
},
{
"active": false,
"default": false,
"urlParameters": {
"taxon_slug": "mugs",
"attributeValues": [
"HOLIDAY COLLECTION"
]
},
"label": "HOLIDAY COLLECTION",
"count": 1
},
{
"active": false,
"default": false,
"urlParameters": {
"taxon_slug": "mugs",
"attributeValues": [
"Holz"
]
},
"label": "Holz",
"count": 1
},
{
"active": false,
"default": false,
"urlParameters": {
"taxon_slug": "mugs",
"attributeValues": [
"Wood"
]
},
"label": "Wood",
"count": 1
}
]
},
"paginator": {
"state": {
"active": false,
"value": 1,
"urlParameters": [],
"name": "paginator",
"options": []
},
"tags": [],
"urlParameters": {
"taxon_slug": "mugs"
},
"resetUrlParameters": {
"taxon_slug": "mugs"
},
"name": "paginator",
"currentPage": 1,
"totalItems": 2,
"maxPages": 10,
"itemsPerPage": 10,
"numPages": 1,
"options": []
},
"search": {
"state": {
"active": false,
"urlParameters": [],
"name": "search",
"options": []
},
"tags": [],
"urlParameters": {
"taxon_slug": "mugs"
},
"resetUrlParameters": {
"taxon_slug": "mugs"
},
"name": "search"
}
}
}
- Filtering by attributes:
You need use attributes query parameter which is an associative array where key is the attribute name and value is an array of attribute values. For e.g:
$this->client->request('GET', '/shop-api/products', ['attributes' => ['Mug material' => ['Wood']]], [], ['ACCEPT' => 'application/json']);
This filter also aggregates all attribute values and it will group them by attribute name Aggregation response from this request:
"attributes":{
"state":{
"active":true,
"value":{
"Mug material":[
"Wood"
]
},
"urlParameters":{
"attributes":{
"Mug material":[
"Wood"
]
}
},
"name":"attributes",
"options":[
]
},
"tags":[
],
"urlParameters":{
"attributes":{
"Mug material":[
"Wood"
]
}
},
"resetUrlParameters":[
],
"name":"attributes",
"items":[
{
"tags":[
],
"urlParameters":[
],
"resetUrlParameters":[
],
"name":"Mug collection",
"choices":{
"HOLIDAY COLLECTION":{
"active":false,
"default":false,
"urlParameters":{
"attributes":{
"Mug material":[
"Wood"
],
"Mug collection":[
"HOLIDAY COLLECTION"
]
}
},
"label":"HOLIDAY COLLECTION",
"count":1
}
}
},
{
"tags":[
],
"urlParameters":[
],
"resetUrlParameters":[
],
"name":"Mug material",
"choices":{
"Holz":{
"active":false,
"default":false,
"urlParameters":{
"attributes":{
"Mug material":[
"Wood",
"Holz"
]
}
},
"label":"Holz",
"count":1
},
"Wood":{
"active":true,
"default":false,
"urlParameters":{
"attributes":{
"Mug material":[
]
}
},
"label":"Wood",
"count":1
}
}
}
]
}
You can combine filters so for example if you want your products to be filtered in specific locale you can add another query parameter
Example request with locale:
$this->client->request('GET', '/shop-api/products', ['attributes' => ['Mug material' => ['Wood']], 'locale' => 'en_GB'], [], ['ACCEPT' => 'application/json']);
Aggregation response from this request:
"attributes":{
"state":{
"active":true,
"value":{
"Mug material":[
"Wood"
]
},
"urlParameters":{
"attributes":{
"Mug material":[
"Wood"
]
}
},
"name":"attributes",
"options":[
]
},
"tags":[
],
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"resetUrlParameters":{
"locale":"en_GB"
},
"name":"attributes",
"items":[
{
"tags":[
],
"urlParameters":[
],
"resetUrlParameters":{
"locale":"en_GB"
},
"name":"Mug collection",
"choices":{
"HOLIDAY COLLECTION":{
"active":false,
"default":false,
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
],
"Mug collection":[
"HOLIDAY COLLECTION"
]
}
},
"label":"HOLIDAY COLLECTION",
"count":1
}
}
},
{
"tags":[
],
"urlParameters":[
],
"resetUrlParameters":{
"locale":"en_GB"
},
"name":"Mug material",
"choices":{
"Wood":{
"active":true,
"default":false,
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
]
}
},
"label":"Wood",
"count":1
}
}
}
]
}
Whole response:
{
"items":[
{
"code":"LOGAN_MUG_CODE",
"name":"Logan Mug",
"slug":"logan-mug",
"taxons":{
"main":"MUG",
"others":[
"MUG",
"CATEGORY",
"BRAND"
]
},
"variants":[
{
"code":"LOGAN_MUG_CODE",
"name":"Logan Mug",
"price":{
"current":1999,
"currency":"GBP"
},
"images":[
]
}
],
"attributes":[
{
"code":"MUG_COLLECTION_CODE",
"name":"Mug collection",
"value":"HOLIDAY COLLECTION"
},
{
"code":"MUG_MATERIAL_CODE",
"name":"Mug material",
"value":"Wood"
}
],
"images":[
],
"channelCode":"WEB_GB",
"localeCode":"en_GB"
}
],
"filters":{
"channel":{
"state":{
"active":false,
"urlParameters":[
],
"name":"channel",
"options":[
]
},
"tags":[
],
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"resetUrlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"name":"channel",
"choices":[
{
"active":false,
"default":false,
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
},
"channel":"WEB_GB"
},
"label":"WEB_GB",
"count":1
}
]
},
"taxon_code":{
"state":{
"active":false,
"urlParameters":[
],
"name":"taxon_code",
"options":[
]
},
"tags":[
],
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"resetUrlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"name":"taxon_code",
"choices":[
{
"active":false,
"default":false,
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
},
"taxonCode":"BRAND"
},
"label":"BRAND",
"count":1
},
{
"active":false,
"default":false,
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
},
"taxonCode":"CATEGORY"
},
"label":"CATEGORY",
"count":1
},
{
"active":false,
"default":false,
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
},
"taxonCode":"MUG"
},
"label":"MUG",
"count":1
}
]
},
"price_range":{
"state":{
"active":false,
"urlParameters":[
],
"name":"price_range",
"options":[
]
},
"tags":[
],
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"resetUrlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"name":"price_range",
"minBounds":1999,
"maxBounds":2999
},
"locale":{
"state":{
"active":true,
"value":"en_GB",
"urlParameters":{
"locale":"en_GB"
},
"name":"locale",
"options":[
]
},
"tags":[
],
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"resetUrlParameters":{
"attributes":{
"Mug material":[
"Wood"
]
}
},
"name":"locale",
"choices":[
{
"active":true,
"default":false,
"urlParameters":{
"attributes":{
"Mug material":[
"Wood"
]
}
},
"label":"en_GB",
"count":1
}
]
},
"paginator":{
"state":{
"active":false,
"value":1,
"urlParameters":[
],
"name":"paginator",
"options":[
]
},
"tags":[
],
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"resetUrlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"name":"paginator",
"currentPage":1,
"totalItems":1,
"maxPages":10,
"itemsPerPage":10,
"numPages":1,
"options":[
]
},
"search":{
"state":{
"active":false,
"urlParameters":[
],
"name":"search",
"options":[
]
},
"tags":[
],
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"resetUrlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"name":"search"
},
"attributes":{
"state":{
"active":true,
"value":{
"Mug material":[
"Wood"
]
},
"urlParameters":{
"attributes":{
"Mug material":[
"Wood"
]
}
},
"name":"attributes",
"options":[
]
},
"tags":[
],
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
]
}
},
"resetUrlParameters":{
"locale":"en_GB"
},
"name":"attributes",
"items":[
{
"tags":[
],
"urlParameters":[
],
"resetUrlParameters":{
"locale":"en_GB"
},
"name":"Mug collection",
"choices":{
"HOLIDAY COLLECTION":{
"active":false,
"default":false,
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
"Wood"
],
"Mug collection":[
"HOLIDAY COLLECTION"
]
}
},
"label":"HOLIDAY COLLECTION",
"count":1
}
}
},
{
"tags":[
],
"urlParameters":[
],
"resetUrlParameters":{
"locale":"en_GB"
},
"name":"Mug material",
"choices":{
"Wood":{
"active":true,
"default":false,
"urlParameters":{
"locale":"en_GB",
"attributes":{
"Mug material":[
]
}
},
"label":"Wood",
"count":1
}
}
}
]
}
}
}
- Sorting
-
By name ascending:
/shop-api/products?channel=WEB_DE&sort[name]=asc
-
By price descending:
/shop-api/products?channel=WEB_DE&sort[price]=desc
-
By attribute
ATTRIBUTE_CODE
ascending:/shop-api/products?channel=WEB_DE&sort[attributes][ATTRIBUTE_CODE]=asc
-
By price ascending, then by name descending:
/shop-api/products?channel=WEB_DE&sort[price]=asc&sort[name]=desc
- Filtering by attribute
-
By attribute name and value:
/shop-api/products?channel=WEB_DE&attributes[Attribute name]=value
-
By attribute code and value:
/shop-api/products?channel=WEB_DE&attributesByCode[ATTRIBUTE_CODE]=value
- Reindexing Elasticsearch
The current implementation does not support updating Elasticsearch when an entity is updated. In order to stay up-to-date, run the following command:
```
bin/console sylius:elastic-search:update-product-index
```
If you want to recreate the index, run (it will drop it):
```
bin/console sylius:elastic-search:reset-product-index
```