ElasticSearch支持AND、OR、NOT任意组合

Support arbitrary combination of AND, OR, NOT in ElasticSearch

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

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

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

这是可能的。如果我没理解错的话,你需要 Query String Query

摘自文档:

A query that uses a query parser in order to parse its content. Here is an example:

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

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

由于您赋予用户自行创建这些查询的权力,因此您永远无法确定他们将输入什么。 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"
  }
}