
Security News
MCP Community Begins Work on Official MCP Metaregistry
The MCP community is launching an official registry to standardize AI tool discovery and let agents dynamically find and install MCP servers.
elastic-graph
Advanced tools
A lightweight query builder for Elastic Search and OpenSearch. You can convert a simple JSON Rule built with the popular JSON Rule Engine library and turn into a valid Elastic Search query
A lightweight query builder for Elastic Search and OpenSearch. You can convert a simple JSON Rule built with the popular JSON Rule Engine library and turn into a valid Elastic Search query. Supports And / OR conditions Nested conditions Offsets / pagination Basic Aggregations Custom operators Custom Aggregators and more
Inspired By: json-rules-engine elastic-builder
use toJson function to convert the query to the json
import QueryBuilder from 'elastic-graph'
// Initialize the class
const queryBuilder = new QueryBuilder()
// Usage
queryBuilder.setRule({
all:[
any:[
{fact:"field-1",operator:"equal",value:"value-1"}
{fact:"field-2",operator:"nonEqual",value:"value-2"}
],
all:[
{fact:"field-3",operator:"lessThanRelative",value:"3",additionalProperties:{
format:"X" // format uses the luxon time formate
}}
]
]
}).toJson()
import QueryBuilder from "elastic-graph";
const queryBuilder = new QueryBuilder();
queryBuilder.addOperator(
"newOperator",
(fact: string, value: any, additionalProperties: DynamicObject) => {
return elasticBuilder.matchQuery(fact, value);
}
);
queryBuilder.addOperator(
"newOperator",
(fact: string, value: any, additionalProperties: DynamicObject) => {
return elasticBuilder.matchQuery(fact, value);
}
);
queryBuilder.removeOperator("newOperator");
queryBuilder.addAggregator(
"newAggregator",
(name: string, fieldName: any, additionalProperties: DynamicObject) => {
return elasticBuilder.sumAggregation(name, fieldName);
}
);
queryBuilder.addAggregator(
"newAggregator",
(name: string, fieldName: any, additionalProperties: DynamicObject) => {
return elasticBuilder.sumAggregation(name, fieldName);
}
);
queryBuilder.removeAggregator("newAggregator");
queryBuilder.setRoutingValue("user1");
queryBuilder.setRule({
all: [{ fact: "field", operator: "equal", value: "value" }],
});
queryBuilder.offset(10);
queryBuilder.limit(10);
queryBuilder.setRoutingValue("user1").offset(10).limit(10)setRule({
all: [{ fact: "field", operator: "equal", value: "value" }],
}).toJson();
queryBuilder.setAggregator([
{ name: "aggregator1", aggregator: "sum", fieldName: "field-1" },
]);
queryBuilder.sum("aggregator-sum", "field-2");
// or
queryBuilder.sum([{ name: "aggregator-sum", fieldName: "field-2" }]);
queryBuilder.avg("aggregator-avg", "field-2");
// or
queryBuilder.avg([{ name: "aggregator-avg", fieldName: "field-2" }]);
queryBuilder.max("aggregator-max", "field-2");
// or
queryBuilder.max([{ name: "aggregator-max", fieldName: "field-2" }]);
queryBuilder.min("aggregator-min", "field-2");
// or
queryBuilder.min([{ name: "aggregator-min", fieldName: "field-2" }]);
queryBuilder.sort("field-2", "desc").sort("field-3", "desc");
// or
queryBuilder.sort([
{ name: "field-2", order: "desc" },
{ name: "field-3", order: "desc" },
]);
{
"fact": "field-name",
"operator": "operator Identifier",
"value": "value",
"additionalProperties": {
// Additional properties for the query
}
}
setRule
queryBuilder.setRule({
all:[
{{
"fact":"field-name",
"operator":"operator Identifier",
"value":"value",
"additionalProperties":{
// Additional properties for the query
}
}}
]
})
setAggregator json format
{
"name": "aggregator name",
"aggregator": "aggregator identifier",
"fieldName": "name of the field aggregation to be performed",
"additionalProperties":{
// Additional Properties for the aggregator
}
}
{
"fact": "fieldName",
"operator": "equal",
"value": "value"
}
equal uses term query{
"fact": "fieldName",
"operator": "containsString",
"value": "value"
}
containsString uses match query{
"fact": "fieldName",
"operator": "equal",
"value": "value"
}
in value give the null replacement value given in the search Database
blank uses term query{
"fact": "fieldName",
"operator": "notEqual",
"value": "value"
}
notEqual uses term query{
"fact": "fieldName",
"operator": "notContainsString",
"value": "value"
}
notContainsString uses match query{
"fact": "fieldName",
"operator": "notBlank",
"value": "value"
}
check for the field value is not null{
"fact": "fieldName",
"operator": "greaterThanAbsolute",
"value": "value"
}
greaterThanAbsolute uses the range query{
"fact": "fieldName",
"operator": "lessThanAbsolute",
"value": "value"
}
lessThanAbsolute uses the range query{
"fact": "fieldName",
"operator": "greaterThanRelative",
"value": "value",
"additionalProperties": {
"format": "yyyy"
}
}
greaterThanRelative uses the range query, But there is a preprocessing it convert to the given format(uses luxon time formatting){
"fact": "fieldName",
"operator": "lessThanRelative",
"value": "value",
"additionalProperties": {
"format": "yyyy"
}
}
lessThanRelative uses the range query, But there is a preprocessing it convert to the given format(uses luxon time formatting){
"fact": "fieldName",
"operator": "notEqualRelative",
"value": "value",
"additionalProperties": {
"format": "yyyy"
}
}
notEqualRelative uses the range query, But there is a preprocessing it convert to the given format(uses luxon time formatting)usage sum aggregator is added as native function
//for single sum aggregator
queryBuilder.sum("aggregatorName", "fieldName");
// or
//for multiple sum aggregator
queryBuilder.sum([
{ name: "aggregator-1", fieldName: "field-1" },
{ name: "aggregator-2", fieldName: "field-2" },
]);
usage max aggregator is added as native function
//for single max aggregator
queryBuilder.max("aggregatorName", "fieldName");
// or
//for multiple max aggregator
queryBuilder.max([
{ name: "aggregator-1", fieldName: "field-1" },
{ name: "aggregator-2", fieldName: "field-2" },
]);
usage sum aggregator is added as native function
//for single min aggregator
queryBuilder.min("aggregatorName", "fieldName");
// or
//for multiple min aggregator
queryBuilder.min([
{ name: "aggregator-1", fieldName: "field-1" },
{ name: "aggregator-2", fieldName: "field-2" },
]);
usage avg aggregator is added as native function
//for single avg aggregator
queryBuilder.avg("aggregatorName", "fieldName");
// or
//for multiple avg aggregator
queryBuilder.avg([
{ name: "aggregator-1", fieldName: "field-1" },
{ name: "aggregator-2", fieldName: "field-2" },
]);
To add custom operator user addOperator function it take two argument operator initializer and callback (callback must return the instance of elasticBuilder )
elasticBuilder -> elastic-builder see reference
import QueryBuilder, { DynamicObject, elasticBuilder } from "elastic-graph";
const queryBuilder = new QueryBuilder();
queryBuilder.addOperator(
"newOperator",
(fact: string, value: any, additionalProperties: DynamicObject) => {
return elasticBuilder.matchQuery(fact, value);
}
);
queryBuilder
.setRule({
all: [{ fact: "fieldName", operator: "newOperator", value: "test" }],
})
.toJson();
To add custom aggregator use addAggregator function it take two argument aggregator initializer and callback (callback must return the instance of elasticBuilder )
elasticBuilder -> elastic-builder see reference
import QueryBuilder, { DynamicObject, elasticBuilder } from "elastic-graph";
const queryBuilder = new QueryBuilder();
queryBuilder.addAggregator(
"newAggregator",
(name: string, fieldName: any, additionalProperties: DynamicObject) => {
return elasticBuilder.sumAggregation(name, fieldName);
}
);
queryBuilder
.setAggregatorRule([
{
name: "aggregatorName",
aggregator: "newAggregator",
fieldName: "fieldName",
},
])
.toJson();
FAQs
A lightweight query builder for Elastic Search and OpenSearch. You can convert a simple JSON Rule built with the popular JSON Rule Engine library and turn into a valid Elastic Search query
We found that elastic-graph demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
The MCP community is launching an official registry to standardize AI tool discovery and let agents dynamically find and install MCP servers.
Research
Security News
Socket uncovers an npm Trojan stealing crypto wallets and BullX credentials via obfuscated code and Telegram exfiltration.
Research
Security News
Malicious npm packages posing as developer tools target macOS Cursor IDE users, stealing credentials and modifying files to gain persistent backdoor access.