从结果中排除项目

时间:2013-08-23 03:57:45

标签: python elasticsearch

我正在使用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
          }
    }

2 个答案:

答案 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过滤器。