marcelsud / elastic-search-plugin
Elastic search integration for Sylius.
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 44
Type:sylius-bundle
Requires
- php: ^7.1
- ongr/elasticsearch-bundle: ^5.0
- ongr/elasticsearch-dsl: ^5.0
- ongr/filter-manager-bundle: ^2.0
- ramsey/uuid: ^3.7
- simple-bus/symfony-bridge: ^4.1
- sylius/sylius: ^1.0@beta
Requires (Dev)
- behat/behat: ^3.2
- behat/mink: ^1.7
- behat/mink-browserkit-driver: ^1.3
- behat/mink-extension: ^2.2
- behat/mink-selenium2-driver: ^1.3
- doctrine/common: <2.8
- friends-of-behat/context-service-extension: ^0.3
- friends-of-behat/cross-container-extension: ^0.2
- friends-of-behat/performance-extension: ^1.0
- friends-of-behat/service-container-extension: ^0.3
- friends-of-behat/symfony-extension: ^0.2.1
- friends-of-behat/variadic-extension: ^0.1
- lakion/api-test-case: ^1.1
- lakion/mink-debug-extension: ^1.2.3
- matthiasnoback/symfony-config-test: ^2.1
- matthiasnoback/symfony-dependency-injection-test: ^1.1
- php-http/guzzle6-adapter: ^1.1
- phpspec/phpspec: ^3.2
- phpunit/phpunit: ^5.6
- dev-master
- v1.0.0-beta.12
- v1.0.0-beta.11
- v1.0.0-beta.10
- v1.0.0-beta.9
- v1.0.0-beta.8
- v1.0.0-beta.7
- v1.0.0-beta.6
- v1.0.0-beta.5
- v1.0.0-beta.4
- v1.0.0-beta.3
- v1.0.0-beta.2
- v1.0.0-beta.1
- v1.0.0-alpha.14
- v1.0.0-alpha.13
- v1.0.0-alpha.12
- v1.0.0-alpha.11
- v1.0.0-alpha.10
- v1.0.0-alpha.9
- v1.0.0-alpha.8
- v1.0.0-alpha.7
- v1.0.0-alpha.6
- v1.0.0-alpha.5
- v1.0.0-alpha.4
- v1.0.0-alpha.3
- v1.0.0-alpha.2
- v1.0.0-alpha.1
- dev-aggregation-attributes-filters
- dev-update-readme-3
- dev-remove-ui-related-stuff
This package is not auto-updated.
Last update: 2024-10-22 18:28:12 UTC
README
Usage
-
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
```