How change the syntax in Elasticsearch 8 where 'body' parameter is deprecated?

Question:

After updating Python package elasticsearch from 7.6.0 to 8.1.0, I started to receive an error at this line of code:

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

receive following error message:

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"]

I don’t understand how to use the above-mentioned "individual parameters".
Here is my query:

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', '']
                    }
                }
        ]
    }
}

In the official documentation, I can’t find any chance to find examples of how to pass my query in new versions of Elasticsearch.

Possibly someone has a solution for this case other than reverting to previous versions of Elasticsearch?

Asked By: milevskyid

||

Answers:

According to the documentation, this is now to be done as follows:

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

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

So the queries are done directly in the same line of code without "body", substituting the api you need to use, in your case "count" for "search".
You can try the following:

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

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

You can find out more by clicking on the following link:

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

For example, if the query would be:

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

Python client would be the next:

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

or

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

Using Elasticsearch 8.4.1, I got the same warning when creating indices via Python client.

I had to this this way instead:

settings = {
    "number_of_shards": 2,
    "number_of_replicas": 1
}
mappings = {
    "dynamic": "true",
    "numeric_detection": "true",
    "_source": {
      "enabled": "true"
    },
    "properties": {
      "p_text": {
        "type": "text"
      },
      "p_vector": {
        "type": "dense_vector",
        "dims": 768
      },
    }
  }

es.indices.create(index=index_name, settings=settings, mappings=mappings)

Hope this helps.

Answered By: yuenherny
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.