Mongodb+Elasticsearch for Ecommerce listings


(Sebastian Herrera) #1

Ive been working in an ecommerce application using mongodb. Now Im planning to Integrate my existing ecommerce infrastructure with elasticsearch to manage the display of products catalogs. My main idea is to incorporate the following functionalities:

  • Categorical Navigation
  • Faceting
  • Geo-Targeting
  • Auto Suggest

This is an example of the application layout I would like to recreate:

Currently I have the following collections in mongodb:
Products: > {

"_id" : ObjectId("568887fc14a9962460fbbcbd"),
"date_created" : "2014-10-01T00:00:00Z",
"date_updated" : "2014-10-01T00:00:00Z",
"name" : "Iphone 6 64gb",
"price" : "100",
"summary" : "Iphone 6 64gb",
"delivery" : "Shipment",
"shipment_location" : "USA",
"shipment_weight" : "1",
"shipment_package_quantity" : "1",
"options" : {
    "id" : "price-1234567890",
    "value" : "111",
    "stock_level" : "1",
    "currency" : "usd"
},
"attributes" : {
    "id" : "atr_1",
    "name" : "memory",
    "values" : "64gb"
},
"images" : {
    "id" : "price-1234567890",
    "caption" : "image",
    "file" : [ 
        {
            "id" : "price-1234567890-1",
            "date_uploaded" : "2014-10-01T00:00:00Z",
            "length" : "123",
            "md5" : "hasg",
            "filename" : "price-1234567890-1",
            "content_type" : "PNG",
            "metadata" : "price-1324567890-1",
            "data" : "price-1234567890-1",
            "url" : "/images/folder/mongodb/a.png"
        }
    ]
},
"category_id" : "65",
"category_index" : {
    "id" : "111",
    "sort" : "price"
},
"stock" : {
    "id" : "price-1234567890",
    "date_created" : "2014-10-01T00:00:00Z",
    "date_updated" : "2014-10-01T00:00:00Z",
    "parent_id" : "",
    "parent" : "111",
    "number" : "111",
    "quantity" : "11",
    "variant_id" : "1",
    "variant" : "11",
    "last" : "1",
    "prev_id" : "1",
    "prev" : "1",
    "level" : "1",
    "reason" : "1",
    "description" : "1",
    "order_id" : "11",
    "order" : "1"
},
"quantity_min" : "1",
"quantity_inc" : "1",

}

Categories Collection:

> {
>     "_id" : 3,
>     "date_created" : "2016-01-01T00:00:00Z",
>     "date_updated" : "2016-01-01T00:00:00Z",
>     "name" : "Computers",
>     "slug" : "Computers",
>     "description" : "Computers",
>     "meta_description" : "Computers",
>     "meta_keyword" : "Computers",
>     "navigation" : "true",
>     "top_id" : 3,
>     "top" : "true",
>     "parent_id" : 2,
>     "parent" : "Default",
>     "active" : "y",
>     "productype" : "simple",
>     "path" : "Computers",
>     "categoryids" : "2,3",
>     "children" : "yes",
> }

Taxonomy:

{
    "_id" : ObjectId("56803181bf244c701d000170"),
    "category_id" : "65",
    "name" : "Names",
    "expandable" : false,
    "inputAsTree" : true,
    "multiSelect" : true,
    "mandatory" : false,
    "version" : 9,
    "createTime" : 1451240000.0000000000000000,
    "lastUpdateTime" : 1451280000.0000000000000000,
}

Taxonomyterms collection:

{
    "_id" : ObjectId("568073e5bf244c701d000179"),
    "text" : "Jose",
    "version" : 2,
    "taxonomyid" : "56803181bf244c701d000170",
    "orderValue" : 1600,
    "expandable" : false,
    "nativeLanguage" : "en",
    "i18n" : {
        "en" : {
            "text" : "Jose",
            "locale" : "en"
        }
    },
}

Taxonomy terms refer to taxonomy. in the first one you can define the main name and in terms define the terms that have a relation with taxonomy (the options). eg: Taxonomy: Names. Taxonomy Terms: bob-jose-pedro

Could anyone shed some light what I have to do to approach the integration with the proposed schema of collections in mongo to design in elasticsearch:

  • Categorical Navigation: products across the entire virtual storefront with guided navigation.
  • Faceting: Auto-extract product information to enable customers to filter by color, size, brand, local availability, and price.

how I can map categories with categorical navigation.?
how can I map taxonomy-terms with faceting.?

or any different approach you believe could be better.

thanks in advance! sebastian.


(system) #2