search-parser
v0.1.19
Published
Parse and create predicate from query expression. Supports boolean operators and keywords.
Downloads
26
Readme
Search Parser
Allow parsing search queries, using free-text, keywords and boolean operators.
Installation
Using yarn:
yarn add search-parser
Using npm:
npm instal search-parser --save
Usage
import { parse, parseToPredicate } from 'search-parser'
API
parse(query)
Convert a query string into an array of arrays of expression objects. Support freetext, keywords (key:value), boolean operators (AND, OR, NOT) and parenthesis. For more information on the shape of the nested arrays, read the documentation at boolean-parser-js.
Each expression object is in the form:
{
key: { condition: value }
}
Where key
is the keyword or 'freetext' in case no given keyword.condition
is either 'include' or 'exclude' (when using NOT operator).
And value
is the term to search.
Sample test case:
test('Parse expression with keywords, freetext and boolean operators', () => {
const expected = [
[{ "name": { "include": "aviv" } }, { "last": { "include": "rosental" } }],
[{ "freetext": { "include": "any other contibuter" } }]
];
expect(parse('name:aviv and last:rosental or any other contibuter')).toEqual(expected);
});
parseToPredicate(query, searchFn)
Parse the query string and convert it into a unified predicate which represent the given query.
When executed on an item
, the predicate will call the given searchFn
and pass it (item, textToSearch, keyword)
.
Sample test case:
const shows = [
{ name: 'iron-fist', year: '2017', rating: '7.6' },
{ name: 'the walking dead', year: '2010', rating: '8.5' },
{ name: 'legion', year: '2017', rating: '8.8' },
{ name: 'game of thrones', year: '2011', rating: '9.5' }
];
function search(item, textToSearch, keyword) {
if (keyword === 'freetext') {
return Object.values(item).map(value => value.toLowerCase()).some(value => value.toLowerCase().includes(textToSearch.toLowerCase()))
}
return item && item[keyword.toLowerCase()] && item[keyword.toLowerCase()].toLowerCase().includes(textToSearch.toLowerCase());
}
test('Search collection with keywords return multiple results', () => {
const predicate = parseToPredicate('year:2017', search);
const results = shows.filter(predicate);
expect(results).toEqual([{ name: 'iron-fist', year: '2017', rating: '7.6' }, { name: 'legion', year: '2017', rating: '8.8' }]);
});
For more examples, see the src/tests folder
Notes
This library depends on boolean-parser-js to parse the expressions using boolean operators (AND, OR).