dimitrov-adrian / directus-extension-searchsync

Simple Directus 9 extension that sync content with remote search engine.
MIT License
115 stars 27 forks source link
algolia directus directus-extension elasticsearch meilisearch

Simple search engine indexer

Supported engines

How to install

In your Directus installation root

npm install dimitrov-adrian/directus-extension-searchsync

or yarn

yarn add https://github.com/dimitrov-adrian/directus-extension-searchsync

Restart directus

CLI Commands

Usage: npx directus extension:searchsync <subdommand>

Subcommands:

Configuration

The extension uses cosmiconfig for configuration loader with searchsync block or if EXTENSION_SEARCHSYNC_CONFIG_PATH is set will try to use the file.

So, configuration should comes from one of next files:

Environment variables

References

Examples

.searchsyncrc.json

{
    "server": {
        "type": "meilisearch",
        "host": "http://search:7700/myindex",
        "key": "the-private-key"
    },
    "batchLimit": 100,
    "reindexOnStart": false,
    "collections": {
        "products": {
            "filter": {
                "status": "published",
                "stock": "inStock"
            },
            "fields": ["title", "image.id", "category.title", "brand.title", "tags", "description", "price", "rating"]
        },
        "posts": {
            "indexName": "blog_posts",
            "collectionField": "_collection",

            "filter": {
                "status": "published"
            },
            "fields": ["title", "teaser", "body", "thumbnail.id"]
        }
    }
}

.searchsyncrc.js

const config = {
    server: {
        type: 'meilisearch',
        host: 'http://search:7700',
        key: 'the-private-key',
    },
    reindexOnStart: false,
    batchLimit: 100,
    collections: {
        pages: {
            filter: {
                status: 'published',
            },
            fields: ['title', 'teaser', 'body', 'thumbnail.id'],
            transform: (item, { flattenObject, striptags }) => {
                return {
                    ...flattenObject(item),
                    body: striptags(item.body),
                    someCustomValue: 'Hello World!',
                };
            },
        },
    },
};

// Use as object.
module.exports = config;
Collection transformation callback description
/**
 * @param {Object} item
 * @param {{striptags, flattenObject, objectMap}} utils
 * @param {String} collectionName
 * @returns {Object}
 */
function (item, { striptags, flattenObject, objectMap }, collectionName) {
    return item
}

Search engines config references

Meilisearch
{
    "type": "meilisearch",
    "host": "http://search:7700",
    "key": "the-private-key"
}
Algolia
{
    "type": "algolia",
    "appId": "Application-Id",
    "key": "secret-api-key"
}
ElasticSearch

New typeless behaviour, use collection names as index name.

{
    "type": "elasticsearch",
    "host": "http://search:9200/"
}

Use Authentification.

{
    "type": "elasticsearch",
    "host": "http://search:9200/",
    "username": "elastic",
    "password": "somepassword"
}

Ignore ssl-certificate-error.

{
    "type": "elasticsearch",
    "host": "http://search:9200/",
    "ignore_cert": true,
}
ElasticSearch for 5.x and 6.x

Old type behaviour, use collection names as types.

{
    "type": "elasticsearch_legacy",
    "host": "http://search:9200/projectindex"
}