Chúng tôi đang xây dựng ngôn ngữ truy vấn của riêng mình tương tự như Mysql bằng antlr4. Ngoại trừ chúng tôi chỉ sử dụng where clause
, nói cách khác, người dùng không nhập các select/from
câu lệnh.
Tôi đã có thể tạo ngữ pháp cho nó và tạo ra các từ vựng / trình phân tích cú pháp / trình nghe trong golang.
Bên dưới tệp ngữ pháp của chúng tôi EsDslQuery.g4:
grammar EsDslQuery;
options {
language = Go;
}
query
: leftBracket = '(' query rightBracket = ')' #bracketExp
| leftQuery=query op=OR rightQuery=query #orLogicalExp
| leftQuery=query op=AND rightQuery=query #andLogicalExp
| propertyName=attrPath op=COMPARISON_OPERATOR propertyValue=attrValue #compareExp
;
attrPath
: ATTRNAME ('.' attrPath)?
;
fragment ATTR_NAME_CHAR
: '-' | '_' | ':' | DIGIT | ALPHA
;
fragment DIGIT
: ('0'..'9')
;
fragment ALPHA
: ( 'A'..'Z' | 'a'..'z' )
;
attrValue
: BOOLEAN #boolean
| NULL #null
| STRING #string
| DOUBLE #double
| '-'? INT EXP? #long
;
...
Ví dụ truy vấn: color="red" and price=20000 or model="hyundai" and (seats=4 or year=2001)
ElasticSearch hỗ trợ truy vấn sql với plugin tại đây: https://github.com/elastic/elSTERearch/tree/master/x-pack/plugin/sql .
Có thời gian khó để hiểu mã java.
Vì chúng ta có Toán tử logic, tôi không chắc chắn làm thế nào để lấy cây phân tích cú pháp và chuyển đổi nó thành truy vấn ES. Ai đó có thể giúp / đề xuất ý tưởng?
Cập nhật 1: Đã thêm nhiều ví dụ với truy vấn ES tương ứng
Ví dụ truy vấn 1: color="red" AND price=2000
Truy vấn ES 1:
{
"query": {
"bool": {
"must": [
{
"terms": {
"color": [
"red"
]
}
},
{
"terms": {
"price": [
2000
]
}
}
]
}
},
"size": 100
}
Truy vấn Ví dụ 2: color="red" AND price=2000 AND (model="hyundai" OR model="bmw")
Truy vấn ES 2:
{
"query": {
"bool": {
"must": [
{
"bool": {
"must": {
"terms": {
"color": ["red"]
}
}
}
},
{
"bool": {
"must": {
"terms": {
"price": [2000]
}
}
}
},
{
"bool": {
"should": [
{
"term": {
"model": "hyundai"
}
},
{
"term": {
"region": "bmw"
}
}
]
}
}
]
}
},
"size": 100
}
Ví dụ truy vấn 3: color="red" OR color="blue"
Truy vấn ES 3:
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": {
"terms": {
"color": ["red"]
}
}
}
},
{
"bool": {
"must": {
"terms": {
"color": ["blue"]
}
}
}
}
]
}
},
"size": 100
}
color="red" and price=20000 or model="hyundai" and (seats=4 or year=2001
trông giống như trong cú pháp ES? Bạn muốn cú pháp JSON, hoặc cú pháp chuỗi truy vấn ngắn hoặc một cái gì đó khác nhau? Nó cũng giúp nếu bạn thêm nhiều hơn 1 ví dụ. Ngoài ra, bạn đã thử một cái gì đó cho mình?