我在搜索服务器上工作,比如弹性搜索。这是我正在开发的一个小项目。已经完成了大部分部分,但我仍然坚持用户与系统的交互方式。
我最初决定用户通过发送带有必填字段及其值的JSON查询来请求。但我面临的问题是,即使我可以使用json方式评估查询,我也无法实现布尔查询和Compounf语句。
我正在尝试像
这样的东西index: name
schema:name
field1: value
field 2: value
但如果实现了布尔表达式,它也可能是这样的
index : name
schema : name
field 1 : name1 or name 2
field 2: <9.22 and >=2.32
field 3: (<9.22 and >=2.32) or (<100 and >90) // compound statement.
有没有一种直接的方法来实现它,而不是实际创建一个查询语言语法。如果是,那么我怎么能实现这一目标,如果不是,那么同样的事情。
我正在考虑根据和/或每个字段拆分值,但如果有复合语句则不会起作用。
我也在查看pyparsing,但我无法弄清楚使用它的工作方式。
答案 0 :(得分:2)
真正的问题是你的复合语句会有多复杂,而且它们只会包含AND和OR关键字。据我所知,你最好为这个定义一个合适的语法,而不是只使用正则表达式的混合来完成工作(虽然这就是语法本身就是这样)。
我建议使用parsely,你可以用lex格式清楚地定义一个语法,并为你生成一个解析器。通过这种方式,您可以更好地对事物进行标记,并在调试时更好地理解。
答案 1 :(得分:1)
不确定。这是一个只使用JSON的例子。
对于基本的单字段查询,请使用映射:
{"fieldname": {"op": "=", "value": "somevalue"}}
对于复合查询,请执行以下操作:
{"and": [
{"field": {"op": "=", "value": "somevalue"}},
{"field2": {"op": ">", "value": 9.22}},
]}
对于复杂查询,如示例所示:
{
"and": [
{
"index": {
"op": "=",
"value": "name"
}
},
{
"schema": {
"op": "=",
"value": "name"
}
},
{
"or": [
{
"field1": {
"op": "=",
"value": "name1"
}
},
{
"field1": {
"op": "=",
"value": "name2"
}
}
]
},
{
"or": [
{
"field2": {
"op": "<",
"value": 9.22
}
},
{
"field2": {
"op": ">=",
"value": 2.32
}
}
]
},
{
"or": [
{
"or": [
{
"field3": {
"op": "<",
"value": 9.22
}
},
{
"field3": {
"op": ">=",
"value": 2.32
}
}
]
},
{
"or": [
{
"field3": {
"op": "<",
"value": 100
}
},
{
"field3": {
"op": ">",
"value": 90
}
}
]
}
]
}
]
}