Skip to content

ElasticSearch integration with advanced filtering options for Sylius eCommerce applications.

Notifications You must be signed in to change notification settings

11mb/SyliusElasticSearchPlugin

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sylius ElasticSearchPlugin

Elastic search for Sylius. Build status on Linux

Usage

  1. Install it:

    $ composer require sylius/elastic-search-plugin
  2. Install elastic search server:

    $ brew install elasticsearch@5.0
  3. Run elastic search server:

    $ elasticsearch
  4. 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(),
  5. 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

  6. 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
  7. Import routing file:

       sylius_search:
           resource: "@SyliusElasticSearchPlugin/Resources/config/routing.yml"
  8. 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
  9. 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"
                     }
                 }
             }


10. 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
                  }
               }
            }
         ]
      }
   }
}


11. 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
    
  1. Filtering by attribute
  • By attribute name and value:

        /shop-api/products?channel=WEB_DE&attributes[Attribute name][0]=value
    
  • By attribute code and value:

        /shop-api/products?channel=WEB_DE&attributesByCode[ATTRIBUTE_CODE][0]=value
    
  1. 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
```

About

ElasticSearch integration with advanced filtering options for Sylius eCommerce applications.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • PHP 99.6%
  • JavaScript 0.4%