RequestError(400, ‘parsing_exception‘, ‘[terms] query does not support [xxx]‘)

一、报错详细信息

[2023-02-09 09:42:08,856][ERROR][bili_activity  base ana] RequestError(400, 'parsing_exception', '[terms] query does not support [mission_id]')
Traceback (most recent call last):
  File "/home/admin/apps/acq-bili-sync/task/__init__.py", line 124, in run
    for data in self.index_data():
  File "/home/admin/apps/acq-bili-sync/task/bili_activity.py", line 300, in index_data
    for datas in self.process():
  File "/home/admin/apps/acq-bili-sync/task/bili_activity.py", line 278, in process
    result1 = self.get_videos_type_percent(client, mission_id)
  File "/home/admin/apps/acq-bili-sync/task/bili_activity.py", line 159, in get_videos_type_percent
    resp = client.search(BILI_VIDEO_INDEX, "_doc", body)
  File "/home/admin/apps/acq-bili-sync/common/es.py", line 33, in search
    return self.client.search(index, doc_type, body, **kwargs)
  File "/home/admin/env/acq-bili-sync/lib/python3.6/site-packages/elasticsearch/client/utils.py", line 84, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/home/admin/env/acq-bili-sync/lib/python3.6/site-packages/elasticsearch/client/__init__.py", line 852, in search
    "GET", _make_path(index, doc_type, "_search"), params=params, body=body
  File "/home/admin/env/acq-bili-sync/lib/python3.6/site-packages/elasticsearch/transport.py", line 358, in perform_request
    timeout=timeout,
  File "/home/admin/env/acq-bili-sync/lib/python3.6/site-packages/elasticsearch/connection/http_urllib3.py", line 231, in perform_request
    self._raise_error(response.status, raw_data)
  File "/home/admin/env/acq-bili-sync/lib/python3.6/site-packages/elasticsearch/connection/base.py", line 230, in _raise_error
    status_code, error_message, additional_info
elasticsearch.exceptions.RequestError: RequestError(400, 'parsing_exception', '[terms] query does not support [mission_id]')

二、原因

因为查询es查询里面使用的是terms,它需要的值是列表([])类型的故报错

三、解决办法

对字段值进行判定是否是list类型,如果不是,转换成list类型即可

from common import EsClient
id='123'
if not isinstance(id, list):
    id = [id]
body = {
    "query": {
        "terms": {
            "mission_id": id
        }
    },
    "aggs": {
        "terms": {
            "terms": {
                "field": "first_type",
                "size": 100
            }
        }
    }
}
print(body)
es=EsClient()
resp = es.search( "bili_video_data", "_doc", body)

你可能感兴趣的:(elasticsearch,python,大数据,全文检索)