我正在使用ElasticSearch使用python搜索mongodb。我想给查询一个项目ID列表,以便将它们从搜索结果中排除。
我尝试过这个查询但是没有结果:
flagged_articles = ["er12", "rt43"]
query = {
"from": page*limit,
"size": limit,
"query": {
"bool": {
"must": {
"range": {
"added" : {
"from" : "2013-04-11T00:00:00"
}
}
},
"ids" : {
"values" : flagged_articles
}
}
答案 0 :(得分:1)
如果使用过滤器而不是查询来执行此操作会更快。过滤器不进行任何分数计算,因此开销较轻。
{
"filtered" : {
"query" : {
"range": {
"added" : {
"from" : "2013-04-11T00:00:00"
}
}
},
"filter" : {
"not" : {
"filter" : {
"ids" : {
"values" : ["123", "456", "789"]
}
},
"_cache" : true
}
}
}
}
注意:默认情况下不缓存not
过滤器(其他过滤器通常被缓存)。我添加了一个_cache: true
参数,表示如果您认为将在后续搜索中使用它,则必须缓存not
过滤器。
答案 1 :(得分:0)
在此处的ES文档(http://www.elasticsearch.org/guide/reference/query-dsl/bool-query/)中,您应该使用bool
过滤器/查询的must_not
来排除结果。重做的例子:
flagged_articles = ["er12", "rt43"]
query = {
"from": page*limit,
"size": limit,
"query": {
"bool": {
"must": {
"range": {
"added" : {
"from" : "2013-04-11T00:00:00"
}
}
},
"must_not" : {
"terms": {
"article.id" : flagged_articles
}
}
}
}
}
未经测试,但我认为这应该指向正确的方向。
修改:澄清,您显然可以使用ids
过滤器放置terms
过滤器。