使用Python

时间:2016-04-27 12:40:49

标签: python json lex

我在搜索服务器上工作,比如弹性搜索。这是我正在开发的一个小项目。已经完成了大部分部分,但我仍然坚持用户与系统的交互方式。

我最初决定用户通过发送带有必填字段及其值的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,但我无法弄清楚使用它的工作方式。

2 个答案:

答案 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
              }
            }
          ]
        }
      ]
    }
  ]
}