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) 应该是一个有效的查询。
运算符规则如下:
- 我在这里定义了三个运算符:“AND”、“OR”和“NOT”。 (这些是 AND、OR 和 NOT。
- “NOT”是一元的,“AND”和“OR”是二元的。 “不”有
比其他两个更高的优先级。
有没有办法让我从 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"
}
}
我有一个应用程序想要公开 API 以向用户查询任意 AND OR NOT 查询。用户应该能够给我一个包含任意数量的 AND、OR 和 NOT 短语的字符串。嵌套规则应该是括号,并且应该应用正常的优先级规则。 例如
query= ( (Abhishek AND Vaid) OR ( Abhishek AND Vaids) ) AND NOT (Abhishek AND Vaider) 应该是一个有效的查询。 运算符规则如下:
- 我在这里定义了三个运算符:“AND”、“OR”和“NOT”。 (这些是 AND、OR 和 NOT。
- “NOT”是一元的,“AND”和“OR”是二元的。 “不”有 比其他两个更高的优先级。
有没有办法让我从 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"
}
}