Skip to content

Simple Directus 9 extension that sync content with remote search engine.

License

Notifications You must be signed in to change notification settings

Fliegerweb/directus-extension-searchsync

 
 

Repository files navigation

Simple search engine indexer

Supported engines

  • MeiliSearch
  • ElasticSearch
  • Algolia

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:

  • index - Reindex all documents from configuration

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:

  • package.json "searchsync":{...}
  • .searchsyncrc
  • .searchsyncrc.json
  • .searchsyncrc.yaml
  • .searchsyncrc.yml
  • .searchsyncrc.js
  • .searchsyncrc.cjs
  • searchsync.config.js
  • searchsync.config.cjs

Environment variables

References

  • server: object Holds configuration for the search engine
  • batchLimit: number Batch limit when performing index/reindex (defaults to 100)
  • reindexOnStart: boolean Performs full reindex of all documents upon Directus starts
  • collections: object Indexing data definition
  • collections.<collection>.filter: object The filter query in format like Directus on which item must match to be indexed (check Filter Rules )
  • collections.<collection>.fields: array<string> Fields that will be indexed in Directus format
  • collections.<collection>.transform: function (Could be defined only if config file is .js) A callback to return transformed/formatted data for indexing.
  • collections.<collection>.indexName: string Force collection name when storing in search index
  • collections.<collection>.collectionField: string If set, such field with value of the collection name will be added to the indexed document. Useful with conjuction with the indexName option
  • collections.<collection>.settings: object Used to pass additional indexing settings for the collection to the search engine (Currently only supported for meilisearch.)
  • collections.<collection>.computePk: function (Can only be defined in .js config file) A callback which can be used to calculate a custom primary key value used for an indexed document. This is useful for composite indexes where multiple collections are stored in the same index and might have overlapping primary keys.

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"],
			"settings": {
				"searchableAttributes": ["title", "description", "tags", "category.title", "brand.title"],
				"displayedAttributes": ["title", "image.id", "description"],
				"sortableAttributes": ["category.title", "price", "rating", "brand.title"]
			}
		},
		"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!',
				};
			},
			settings: {
				searchableAttributes: ['title', 'description', 'tags', 'category.title', 'brand.title'],
				displayedAttributes: ['title', 'image.id', 'description'],
				sortableAttributes: ['category.title', 'price', 'rating', 'brand.title'],
			},
		},
	},
};

// 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"
}

About

Simple Directus 9 extension that sync content with remote search engine.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 95.4%
  • TypeScript 4.6%