Parse and serialize ElasticSearch search query strings.
This package allows to parse an elastic simple query string into an AST, and serialize string search queries out of it.
Notes:
- Serialization will enforce classic boolean operator precedence by using parenthesis groups everywhere applicable.
( ) Group
[WORD] Char+
| OR
\+ AND
-- Exclude
"" Exact
~n Fuzzy
\* Prefix
Specific case : Spaces (signifying in some contexts and not in others)
type Expr
= And (List Expr)
| Exact String
| Exclude Expr
| Fuzzy Int String
| Or (List Expr)
| Prefix String
| Word String
Unless explicitly indicated, spaces are ignored.
Query => ORExpr EOF
ORExpr => ANDExpr | ANDExpr "|" ORExpr
ANDExpr => EXCExpr | EXCExpr ("+"|\s+) ANDExpr
EXCExpr => "-" GRPExpr | GRPExpr
GRPExpr => WORD~"\*" | WORD~"\~2" | WORD | \" EXACTExpr \" | "(" ORExpr ")"
EXACTExpr => [^"]+
Source query string:
big* (potatoes | "french fries") -salad
Parsing:
$ elm repl
---- Elm 0.19.0 ----------------------------------------------------------------
Read <https://elm-lang.org/0.19.0/repl> to learn more: exit, help, imports, etc.
--------------------------------------------------------------------------------
> import Elastic exposing (Expr(..))
> Elastic.parse "big* (potatoes | \"french fries\") -salad"
Ok (And [Prefix "big",Or [Word "potatoes",Exact ("french fries")],Exclude (Word "salad")])
: Result (List Parser.DeadEnd) Elastic.Expr
Serialization:
> Elastic.serialize (And [Prefix "big",Or [Word "potatoes",Exact ("french fries")],Exclude (Word "salad")])
"big* (potatoes | \"french fries\") -salad" : String