# Data Migrations for Elacticsearch

REMINDER

This document is archived and NOT relevant with the latest version which is 1.12 at the time of writing. Please keep in mind this document is supposed to help you maintain legacy product, not the fresh installation.

Vue Storefront uses Elasticsearch as a primary data store. We're using Redis as a cache layer and Kue for queue processing.

Although all of these data stores are basically schema-free, some mappings and meta data should be used for setting ES indices and so forth.

Vue Storefront uses a data-migration mechanism based on node-migrate (opens new window).

# Migration tool

We use node-migrate, which is pre-configured with npm, so we're using the following alias:

yarn migrate

which runs the migrations against migrations folder.

# How to add new migration?

You can add a new migration by simply adding a file to the migrations directory (not recommended) or using the command line tool:

yarn migrate create name-of-my-migration

The tool automatically generates the file under the migrations folder.

# Examples

The example migrations show how to manipulate products and mappings. Let's take a look at the mapping modification:

// Migration scripts use: https://github.com/tj/node-migrate
'use strict';

let config = require('config');
let common = require('./.common');

module.exports.up = function(next) {
  // example of adding a field to the schema
  // other examples: https://stackoverflow.com/questions/22325708/elasticsearch-create-index-with-mappings-using-javascript,
  common.db.indices
    .putMapping({
      index: config.elasticsearch.indices[0],
      type: 'product',
      body: {
        properties: {
          slug: { type: 'string' }, // add slug field
          suggest: {
            type: 'completion',
            analyzer: 'simple',
            search_analyzer: 'simple',
          },
        },
      },
    })
    .then(res => {
      console.dir(res, { depth: null, colors: true });
      next();
    });
};

module.exports.down = function(next) {
  next();
};

... and that's it 😃