在ElasticSearch

时间:2016-01-10 11:58:00

标签: java parsing elasticsearch lexer

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

query =((Abhishek AND Vaid)OR(Abhishek AND Vaids))AND NOT(Abhishek AND Vaider)应该是有效的查询。 运营商的规则如下:

  • 我在这里定义了三个运营商:" AND"," OR"和"不是"。 (这些是AND,OR和NOT。
  • "不是"是一元的" AND"和"或者"是二进制的。 "不是"具有 优先于其他两个。

有没有办法让我从ES中的Java Driver开箱即用?请注意,我总是可以在嵌套的布尔值中转换这样的查询,但我不想写一个词法分析器和解析器来创建一个解析树,然后将其解析为复杂的布尔DSL。 我正在寻找一些现有功能来实现这一目标

2 个答案:

答案 0 :(得分:3)

由于您为用户提供了自己创建查询的能力,因此您无法确定他们将输入什么。 query_string将起作用,但如果您的用户提供语法错误的查询,则很可能会抛出异常。

出于这个原因,创建了另一个查询,即strftime,它在语义上等同于query_string,但绝不会抛出任何异常并丢弃用户所做的任何语法错误。

另外,可以使用flags设置仅启用所需的运算符,即AND(+),OR(|)和NOT({{ 1}})。

-

答案 1 :(得分:2)

这是可能的。如果我理解正确,您需要Query String Query

取自文件:

  

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

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

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