0

我正在尝试使用 Python 3.7 中的 elasticsearch-dsl 库向 Elasticsearch 编写查询。

我想我设法写了大部分内容,但我遇到了“存在”子句的问题。

这是我要翻译的查询:

            {
                "query": {
                    "constant_score": {
                        "filter": {
                            "bool": {
                                "must": { 
                                    "term": { "locale": "$locale" }
                                },
                                "must_not": {
                                    "term": { "blacklist_country": "$country_code" }
                                },
                                "should": [
                                { "term": { "whitelist_country": "$country_code" } },
                                { "bool": {
                                    "must_not": {
                                        "exists": { "field": "whitelist_country" }
                                    }
                                }}
                                ]
                            }
                        }
                    }
                }
            }

这就是我到目前为止所拥有的:

q = Q('constant_score',
            filter={Q('bool',
                must=[Q('term', locale=locale)],
                must_not=[Q('term', blacklist_country=country_code)],
                should=[Q('term', whitelist_country=country_code),
                        Q('bool',
                            must_not=[Q('exists', field='whitelist_country')]
                        )
                       ]
                    )}
            )

我希望查询能够正常运行,但我目前收到此错误:

...
must_not=[Q('exists', field='whitelist_country')]
TypeError: unhashable type: 'Bool'
4

1 回答 1

0

对于有同样问题的人,我是这样解决的:

search = Search(using=client_es, index="articles") \
            .query('constant_score', filter=Q('bool',
                must=Q('term', locale=locale),
                must_not=Q('term', blacklist_country=country_code),
                should=[Q('term', whitelist_country=country_code),
                        Q('bool',
                            must_not=Q('exists', field='whitelist_country')
                        )
                       ]
                    ))
于 2019-05-10T19:20:21.180 回答