我正在使用Elasticsearch查找我的结果。我如何在查询中对两个字段求和?
{
"query": {
"bool": {
"must": [
{ "term": { "x.flag1": "false" } },
{ "term": { "x.flag2": "false" } }
]
}
}
}
现在我想找到两个字段x.a
和x.b
的总和,并将其与其他字段进行比较,比如x.c
(x.a + x.b === x.c)
我必须在bool查询中包含它。因此,只有那些满足这两个条件的记录才会出现在我的结果中。这可能吗?
答案 0 :(得分:0)
你可以通过script
query这样做:
ES 2.x以后的查询:
{
"query": {
"bool": {
"must": [
{
"term": {
"x.flag1": "false"
}
},
{
"term": {
"x.flag2": "false"
}
}
],
"filter": {
"script": {
"script": "doc['x.a'].value + doc['x.b'].value === doc['x.c'].value"
}
}
}
}
}
2.0之前的ES版本的相同查询:
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"x.flag1": "false"
}
},
{
"term": {
"x.flag2": "false"
}
},
{
"script": {
"script": "doc['x.a'].value + doc['x.b'].value === doc['x.c'].value"
}
}
]
}
}
}
}
}
请注意,您需要enable dynamic scripting才能生效(即script.inline: true
)。
但是,如果您有许多文档,这可能会使您的ES群集速度变慢。如果可能的话,这应该在索引时完成,你可以在那里完全为此创建另一个布尔字段,然后你可以简单地根据包含你需要的true/false
条件的布尔字段来过滤文档。