这个任务听起来很简单: 如果document field等于特定值,则添加filter,否则不应用filter。
F.X。从仓库中获取所有水果,但如果fruit.type是苹果,请在7天前送到它们。
弹性水平可以吗?
提前谢谢。
答案 0 :(得分:0)
可以在elassticsearch中使用Nesting Boolean Queries和range - 糖和date-math - 魔法进行此操作。
由于您没有发布您的地图或一些示例数据,我将使用以下数据:
curl -XPOST http://localhost:9200/testing/foo/ -d '{ "fruit" : "orange", "delivered" : "2016-04-22"}'
curl -XPOST http://localhost:9200/testing/foo/ -d '{ "fruit" : "banana", "delivered" : "2016-03-22"}'
curl -XPOST http://localhost:9200/testing/foo/ -d '{ "fruit" : "orange", "delivered" : "2016-04-12"}'
curl -XPOST http://localhost:9200/testing/foo/ -d '{ "fruit" : "apple", "delivered" : "2016-04-12"}'
curl -XPOST http://localhost:9200/testing/foo/ -d '{ "fruit" : "apple", "delivered" : "2016-04-20"}'
然后以下查询将执行您想要的操作:
curl -XGET "http://localhost:9200/testing/foo/_search" -d'
{
"query": {
"constant_score": {
"filter": {
"bool": {
"should": [
{
"bool": {
"must_not": {
"term": {
"fruit": "apple"
}
}
}
},
{
"bool": {
"must": [
{
"term": {
"fruit": "apple"
}
},
{
"range": {
"delivered": {
"lt": "now-7d"
}
}
}
]
}
}
]
}
}
}
}
}'
在SQL中,这大致转换为:
WHERE fruit <> 'apple' OR (fruit = 'apple' AND delivered < Now-7d)