Как изменить синтаксис в Elasticsearch 8, где параметр body устарел?

После обновления пакета Python elasticsearch с 7.6.0 до 8.1.0 я начал получать сообщение об ошибке в этой строке кода:

count = es.count(index=my_index, body = {'query': query['query']} )["count"]

получить следующее сообщение об ошибке:

DeprecationWarning: The 'body' parameter is deprecated and will be removed in a future version. Instead use individual parameters.
count = es.count(index=ums_index, body = {'query': query['query']} )["count"]

Я не понимаю, как использовать вышеупомянутый "индивидуальные параметры". Вот мой запрос:

query = {
    "bool": {
        "must": 
        [
                {"exists" : { "field" : 'device'}},
                {"exists" : { "field" : 'app_version'}},                    
                {"exists" : { "field" : 'updatecheck'}},
                {"exists" : { "field" : 'updatecheck_status'}},
                {"term" : { "updatecheck_status" : 'ok'}},
                {"term" : { "updatecheck" : 1}},
                {
                    "range": {
                    "@timestamp": {
                        "gte": from_date,
                        "lte": to_date,
                        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
                        }
                    }
                }
        ],
        "must_not":
        [
                {"term" : { "device" : ""}},
                {"term" : { "updatecheck" : ""}},
                {"term" : { "updatecheck_status" : ""}},
                {
                    "terms" : { 
                        "app_version" : ['2.2.1.1', '2.2.1.2', '2.2.1.3', '2.2.1.4', '2.2.1.5',
                                        '2.2.1.6', '2.2.1.7', '2.1.2.9', '2.1.3.2', '0.0.0.0', '']
                    }
                }
        ]
    }
}

В официальной документации я не могу найти примеры того, как передать мой запрос в новых версиях Elasticsearch.

Возможно, у кого-то есть решение для этого случая, кроме возврата к предыдущим версиям Elasticsearch?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
160
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

сильный текстСогласно документации, теперь это нужно сделать следующим образом:

# ✅ New usage:
es.search(query = {...})

# ❌ Deprecated usage:
es.search(body = {"query": {...}})

Таким образом, запросы выполняются непосредственно в той же строке кода без «тела», заменяя API, который вам нужно использовать, в вашем случае «количество» для «поиска». Вы можете попробовать следующее:

# ✅ New usage:
es.count(query = {...})

# ❌ Deprecated usage:
es.count(body = {"query": {...}})
enter code here

Вы можете узнать больше, перейдя по следующей ссылке:

https://github.com/elastic/elasticsearch-py/issues/1698

Например, если запрос будет таким:

GET index-00001/_count
{
    "query" : {
        "match_all": {
        }
    }
}

Клиент Python будет следующим:

my_index = "index-00001"
query =  {
           "match_all": {
            }
          }
hits = en.count(index=my_index, query=query)

или

hits = en.count(index=my_index, query = {"match_all": {}})

Когда я пытаюсь изменить параметр в соответствии с рекомендациями: """count = en.count(index= my_index, query=query['query'] )["count"]""" вместо """count = en.count (index= my_index, body = {'query': query['query']} )["count"]""" - я получаю эту ошибку "Клиент заметил, что сервер не Elasticsearch, и мы не поддерживаем этот неизвестный продукт"

milevskyid 03.04.2022 13:53

Я обновил ответ примером. Я надеюсь, что это работает или полезно

Miguel Barrios 04.04.2022 14:01

Я думаю, что сообщение об ошибке сообщает о проблемах с подключением к вашему кластеру elasticsearch, а не к запросу. Вы можете попробовать следующее: client = Elasticsearch(cloud_id=CLOUD_ID,basic_auth=("elastic", ELASTIC_PASSWORD)) и затем: client.info( ). astic.co/guide/en/elasticsearch/client/python-api/master/…

Miguel Barrios 05.04.2022 15:00

Другие вопросы по теме