Elasticsearch 使用过滤器过滤掉不需要的关键字

Elasticsearch use filter fo filter out unwanted keywords

现在我有以下形式的一些数据:

df = pd.DataFrame([['foo','some text',1, 13],['foo','Another text',2, 4],['foo','Third text',3, 10],['bar','Text1',2, 25], ['bar','Long text',1, 17],['num','short text',3, 0],['num','fifth text',3, 8]], index = range(1,8), columns = ['category','text','label', 'count'])

我已经将文档放入一个es索引中,并尝试以获取大于0且小于10的“count”和不是“foo”的“category”为条件进行搜索。

我试图在布尔查询的“filter”子句中使用“none”子句,但它给出了“没有为 [none] 注册的查询”的错误。

text: "text"
data = json.dumps({
    "query":{
        "bool":{
            "should":[
                {
                    "match":{
                        "text":text
                    }
                }
            ],
            "filter": [
                {
                    "range": {
                        "count": {
                            "from": 0,
                            "to": 10
                    }
                    }
                },
                {
                    "none": {
                        "term": {
                            "category.keyword": "foo"
                        }
                    }
                }
            ]
            
        }
    }
})

所以我现在使用“must_not”子句如下:

text: "text"
data = json.dumps({
    "query":{
        "bool":{
            "should":[
                {
                    "match":{
                        "text":text
                    }
                }
            ],
            "filter": [
                {
                    "range": {
                        "count": {
                            "from": 0,
                            "to": 10
                    }
                }
                }
            ]
            ,
            "must_not":[
                {
                    "term": {
                        "category.keyword": "foo"
                    }
                }
            ]
        }
    }
})

有没有办法在“filter”子句中使用“none”并使查询更有效?谢谢!

documentation中所述,must_not子句的评分被忽略,因此不会对查询(上面使用的)的性能产生影响,即使must_not 子句包含在过滤器子句之外。

The clause (query) must not appear in the matching documents. Clauses are executed in filter context meaning that scoring is ignored and clauses are considered for caching. Because scoring is ignored, a score of 0 for all documents is returned.

除此之外,没有 none 查询,只有 Match None query,不匹配任何文档。