1

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

2 回答 2

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

祝你好运!

于 2013-08-23T07:02:05.690 回答
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过滤器的地方使用过滤器。

于 2013-08-23T05:24:34.850 回答