我有一个应用程序,它想公开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" } }
您应该弄清楚如何使用它来实现您的逻辑。