在ElasticSearch中支持AND、OR、NOT的任意组合



我有一个应用程序,它想公开API来向用户查询Arbitary AND OR NOT查询。用户应该能够给我一个字符串,其中包含任意数量的AND、OR和NOT短语。嵌套的规则应该是括号,并且应该应用正常的优先级规则。例如

query=((Abhishek AND Vaid)OR(Abhischek AND Vaids))AND NOT(Abhisshek AND Vaider)应为有效查询。操作员规则如下:

  • 我在这里定义了三个运算符:"AND"、"OR"one_answers"NOT"。(这些是AND、OR和NOT
  • "NOT"是一元的,"and"one_answers"OR"是二进制的。"NOT"有优先级高于其他两个

有没有一种方法可以让我从ES中的Java驱动程序中开箱即用?请注意,我总是可以在嵌套布尔中转换这样的查询,但我不想编写lexer和解析器来从头创建解析树,然后将其解析为复杂的布尔DSL我正在寻找一些现有的功能来实现这一点

由于您赋予用户自己创建这些查询的权力,因此您永远无法确定他们将输入什么。query_string可以工作,但如果用户提供语法不正确的查询,则很可能引发异常。

出于这个原因,创建了另一个查询,即simple_query_string,它在语义上等同于query_string,但永远不会抛出任何异常,也不会丢弃用户正在犯的任何语法错误。

此外,还可以使用flags设置仅启用所需的运算符,即AND(+)、OR(|)和NOT(-)。

{
  "simple_query_string" : {
    "fields" : ["content"],
    "query" : "this + that | other -another",
    "flags" : "AND|OR|NOT"
  }
}

这是可能的。如果我理解正确,你需要查询字符串查询

取自文件:

使用查询解析器来解析其内容的查询。在这里是一个例子:

{
  "query_string" : {
    "default_field" : "content",
    "query" : "this AND that OR thus"
  }
}

您应该弄清楚如何使用它来实现您的逻辑。

最新更新