@gigster/module-loopback-elasticsearch

Role | Name | Email | Slack ---- | ---- | ----- | ----- *Product Owner* | Frances Haugen | [frances@gigster.com](mailto:frances@gigster.com) | [@frances] *Maintainer* | Alice Wang | [alice@gigster.com](mailto:alice@gigster.com) | [@alicebot] *Developer* |

Stats

StarsIssuesVersionUpdatedCreatedSize
@gigster/module-loopback-elasticsearch
2.0.03 years ago4 years agoMinified + gzip package size for @gigster/module-loopback-elasticsearch in KB

Readme

loopback-elasticsearch

Role Name Email Slack
Product Owner Frances Haugen frances@gigster.com [@frances]
Maintainer Alice Wang alice@gigster.com [@alicebot]
Developer Jerome Curlier jerome@gigster.com [@jerome]

Why Use ElasticSearch?

Traditional relational databases excel at precise and exact matches. While ElasticSearch can perform exact matching and statistical calculations, its strength lies in an approximation task based on scores of its search results.

Taken from the following Stackexchange answer:

The following examples highlight some good use cases for ElasticSearch:

  • Searching a large number of product descriptions for the best match for a specific phrase (ie "chef’s knife") and returning the most relevant results
  • Given the previous example, breaking down the various departments where "chef’s knife" appears
  • Searching text for words that sound like "season"
  • Auto-completing a search box based on partially typed words based on previously issued searches, accounting for misspellings
  • Storing a large quantity of semi-structured (JSON) data in a distributed fashion, with a specified level of redundancy across a cluster of machines (multitenancy)

Not so good candidates for ElasticSearch:

  • Calculating how many items are left in the inventory
  • Figuring out the sum of all line-items on all the invoices sent out in a given month
  • Executing two operations transactionally with rollback support
  • Creating records that are guaranteed to be unique across multiple given terms, for instance a phone number and extension

Overview

This module provides elastic search for Loopback.

The module is based on the blog post Integrating LoopBack with ElasticSearch. Please therefore review the post to learn about this module.

It consumes the ElasticSearch API through the JavaScript client: ElasticSearch API

Usage

- name: loopback-elasticsearch
        location: 'npm:@gigster/loopback-elasticsearch@1.1.0'
  spec:
    models:
      - name: user
      - name: expense

Specification

Name Status
models List of models to apply the search to.

Endpoints

The following endpoints are provided for the search.

Endpoint Method Description
POST /model/search search Performs a search on the model

Examples

NYT Article Search

Search over 20 NYT articles.

Dependencies

The loopback-elasticsearch depends on the loopback-models module.

The following npm packages are used:

npm version
elasticsearch ^13.3.1

Environment variables

Name Description
ESHOST Elastic search host, for example https://497d894184dd5958f9b477a5982fb1cf.ap-southeast-1.aws.found.io:9243
ESAUTH Elastic search password

Tests

Module tests are defined using a test/scenarios.yaml file. This file defines the set of example gigs that we generate as part of integration testing. To run all tests, run yarn test at the root of this module.

Each scenario is generated in test/scenario/<name> which you can then cd into and run the actual app. For a scenario called default, this is done via:

cd test/scenario/default
yarn install

# Run tests.
yarn test

# Start the app.
yarn start

Docker

docker pull docker.elastic.co/elasticsearch/elasticsearch:5.6.3
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:5.6.3

Then start the applccation with the default password.

ESAUTH=elastic:changeme npm start

Generation

Models

For each model, the module contributes a search endpoint. The implementation of the search is provided as a method on the model in a file search.js in the model folder.

Helper

The module contribute the elasticsearch.js helper to connect to Elasticsearh.

Troubleshooting

DEBUG=gdt:loopback:elasticsearch npm start

TODO

  • Use mixins instead of generating the search method for each model

If you find any bugs or have a feature request, please open an issue on github!

The npm package download data comes from npm's download counts api and package details come from npms.io.