Skip to content

bpolaszek/meilisearch-filters

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

npm version CI Workflow License: MIT

MeiliSearch Filters

This library allows you to build Meilisearch filters in your Javascript/Typescript projects, using a simple and fluent interface.

Examples:

import { field } from 'meilisearch-filters'

const filter = field('first_name').equals("Donald")
  .and(field('hair_color').isIn(['blond', 'orange']))
  .and(field('password').notEquals('covfefe'))
  .and(field('brain').isNull())

console.log(filter.toString()) // first_name = 'Donald' AND hair_color IN ['blond', 'orange'] AND password != 'covfefe' AND brain IS NULL

Installation

npm install meilisearch-filters --save # If you're using NPM
yarn add meilisearch-filters # If you're using Yarn

Usage

Comparison Filters

import { field } from 'meilisearch-filters'

`${field('cat').equals("Berlioz")}` // cat = 'Berlioz'
`${field('cat').notEquals("O'Malley")}` // cat != 'O\\'Malley'
`${field('age').isGreaterThan(5)}` // age > '5'
`${field('age').isGreaterThan(5, true)}` // age >= '5'
`${field('age').isNotGreaterThan(5)}` // age <= '5'
`${field('age').isNotGreaterThan(5, true)}` // age < '5'
`${field('age').isLowerThan(10)}` // age < '10'
`${field('age').isLowerThan(10, true)}` // age <= '10'
`${field('age').isNotLowerThan(10)}` // age >= '10'
`${field('age').isNotLowerThan(10, true)}` // age > '10'

Between Filter

import { field } from 'meilisearch-filters'

`${field('age').isBetween(5, 10)}` // age '5' TO '10'
`${field('age').isNotBetween(5, 10)}` // NOT age '5' TO '10'
`${field('age').isBetween(5, 10, false)}` // age > '5' AND age < '10'
`${field('age').isNotBetween(5, 10, false)}` // NOT (age > '5' AND age < '10')

Exists Filter

import { field } from 'meilisearch-filters'

`${field('god').exists()}` // god EXISTS
`${field('god').doesNotExist()}` // god NOT EXISTS

Empty Filter

import { field } from 'meilisearch-filters'

`${field('glass').isEmpty()}` // glass IS EMPTY
`${field('glass').isNotEmpty()}` // glass IS NOT EMPTY

Null Filter

import { field } from 'meilisearch-filters'

`${field('nullish').isNull()}` // nullish IS NULL
`${field('nullish').isNotNull()}` // nullish IS NOT NULL

IN Filter

import { field } from 'meilisearch-filters'

const cat = field('cat')
`${cat.isIn(['Berlioz', "O'Malley"])}` // cat IN ['Berlioz', 'O\\'Malley']
`${cat.isNotIn(['Berlioz', "O'Malley"])}` // cat NOT IN ['Berlioz', 'O\\'Malley']

CONTAINS filter

import { field } from 'meilisearch-filters'

`${field('cat').contains('Berlioz')}` // cat CONTAINS 'Berlioz'
`${field('cat').doesNotContain('Berlioz')}` // cat NOT CONTAINS 'Berlioz'

STARTS WITH filter

import { field } from 'meilisearch-filters'

`${field('cat').startsWith('Ber')}` // cat STARTS WITH 'Ber'
`${field('cat').doesNotStartWith('Ber')}` // cat NOT STARTS WITH 'Ber'

Geographic filters

import { withinGeoRadius, notWithinGeoRadius } from 'meilisearch-filters'

`${withinGeoRadius(50.35, 3.51, 3000)}` // _geoRadius(50.35, 3.51, 3000)
`${notWithinGeoRadius(50.35, 3.51, 3000)}` // NOT _geoRadius(50.35, 3.51, 3000)
import { withinGeoBoundingBox, notWithinGeoBoundingBox } from 'meilisearch-filters'

`${withinGeoBoundingBox([50.55, 3], [50.52, 3.08])}` // _geoBoundingBox([50.55, 3], [50.52, 3.08])
`${notWithinGeoBoundingBox([50.55, 3], [50.52, 3.08])}` // NOT _geoBoundingBox([50.55, 3], [50.52, 3.08])

Composite filters

import { field } from 'meilisearch-filters'

const cat = field('cat')
const color = field('color')
const age = field('age')
`${cat.equals("Berlioz").and(age.between(5, 10))}` // cat = 'Berlioz' AND age '5' TO '10'
`${cat.equals("Berlioz").or(age.between(5, 10))}` // cat = 'Berlioz' OR age '5' TO '10'

// Automatic grouping
`${color.equals('ginger').or(cat.equals("Berlioz").and(age.between(5, 10)))}` // color = 'ginger' OR (cat = 'Berlioz' AND age '5' TO '10')

NOT filter

import { field, not } from 'meilisearch-filters'

const color = field('ginger')
`${not(color.equals('ginger'))}` // NOT color = 'ginger' 

Adding parentheses

import { field, group } from 'meilisearch-filters'

const color = field('ginger')
`${group(color.equals('ginger'))}` // (color = 'ginger') 

Instantiation

Without any filter

import { filterBuilder } from 'meilisearch-filters'

let filters = filterBuilder()
`${filters}` // ''
filters = filters.and(field('foo').equals('bar'))
`${filters}` // foo = 'bar'

With existing filters

import { filterBuilder } from 'meilisearch-filters'

let filters = filterBuilder(
  field('foo').equals('bar'), 
  field('fruit').equals('banana'),
  field('vegetable').equals('potato'),
)
`${filters}` // foo = 'bar' AND fruit = 'banana' AND vegetable = 'POTATO'

Tests

npm run test # If you're using NPM
yarn test # If you're using Yarn

License

MIT.

About

Expression builder for Meilisearch filters.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published