EQL is a small expression-oriented query language with a lexer, recursive-descent parser, AST, and executor. It produces the same Filter and QueryPlan objects the SDK builders produce.
Shape
python
client.query_eql(
"search in docs nearest $q k 10 where year >= 2023 yield",
{"q": query_vector},
)bash
elips query /my_db --eql 'search in docs nearest [0.1,0.2,0.3] k 5 yield'search — nearest-neighbour search
eql
search in <collection>
nearest <[literal] | $binding>
[k <int>]
[threshold <number>]
[where <filter>]
[rank_by <distance | field>]
[project <* | field, field, ...>]
yieldkdefaults to 10 — unbounded when athresholdrange is supplied.topis still accepted as a deprecated alias fork.rank_by <field>re-sorts results by a metadata field; default is distance.projecttrims the returned payload.
get — by id
eql
get from <collection> id "<uuid>" yieldscan — iterate
eql
scan in <collection> [where <filter>] [offset <int>] [limit <int>] yieldadd / delete
eql
add in <collection> vector [0.1, 0.2, ...] [metadata { "key": value, ... }]
delete from <collection> id "<uuid>"The verbs are lowercase and case-sensitive. The pre-1.1 spellings seek/fetch/place/erase remain accepted as deprecated synonyms.
Filters
eql
filter := term (("and" | "or") term)* | "not" filter | "(" filter ")"
term := field <comparator> value
| field "in" [ value, value, ... ]
| field "contains" "substring"
comparator := = | != | < | <= | > | >=
value := "string" | number | true | falseNumbers without a decimal point are integers. contains is a substring match on string fields. Comments start with # and run to end of line.
Examples
eql
# filtered search with projection
search in articles
nearest $embedding
k 10
where category = "technology" and published_year >= 2023
project title, author
yield
# range search
search in faces nearest $probe threshold 0.15 where verified = true yield
# membership scan
scan in users where country in ["US", "GB", "CA"] limit 100 yield