python 查询es报错
apierror(406, 'content-type header [application/vnd.elasticsearch+json; compatible-with=8] is not supported
原因
服务端用的是aws opensearch 1.3,我本地下的elasticsearch版本8.*太高了不兼容
解决办法
根据官网提示,“amazon opensearch service是一项托管服务,可在aws云中轻松部署、操作和扩展opensearch群集。amazon opensearch service支持opensearch和旧版elasticsearch oss(最高可达7.10,该软件的最终开源版本)。当你创建一个集群时,你可以选择使用哪个搜索引擎。”下载了elasticsearch 7.10后,可以正常查询es索引
附代码
下面展示一些 内联代码片
。
import os
from sshtunnel import sshtunnelforwarder
from elasticsearch import elasticsearch
import logging
import json
import traceback
import time
from config.config import config
from utils.readyaml import readyaml
from utils.logger_handler import loggerhandler
# 设置日志记录
logging.basicconfig(level=logging.info)
logger = loggerhandler()
class sshesclient:
def __init__(self, ssh_host, ssh_port, ssh_username, ssh_private_key_path, es_host, es_port,
es_username, es_password: str):
"""
:param ssh_host:ssh 跳板机ip
:param ssh_port:ssh 跳板机端口
:param ssh_username:跳板机用户名
:param ssh_private_key_path:私钥文件地址
:param es_host:es 服务器地址
:param es_port:es 服务器端口
:param es_username:es 服务器用户名
:param es_password:es 服务器密码
"""
# ssh 跳板机参数
self.es_password = es_password
self.es_username = es_username
self.ssh_private_key_path = ssh_private_key_path
self.ssh_username = ssh_username
self.ssh_port = ssh_port
self.ssh_host = ssh_host
# redis 服务器参数
self.es_port = es_port
self.es_host = es_host
# 尝试使用不同的本地端口
self.local_port = local_port # 更改为不同的端口
self.tunnel = none
self.es = none
def __enter__(self):
try:
# 建立 ssh 隧道
self.tunnel = sshtunnelforwarder(
(self.ssh_host, self.ssh_port),
ssh_username=self.ssh_username,
ssh_pkey=self.ssh_private_key_path,
remote_bind_address=(self.es_host, self.es_port),
local_bind_address=('0.0.0.0', 0) # 绑定到所有本地地址,并让系统自动选择一个本地端口
)
# 开启隧道
self.tunnel.start()
# print(self.tunnel)
if self.tunnel.is_active:
logger.info('ssh 连接已成功建立')
# logger.info(f'本地端口 {self.local_port} 已映射到 es 服务器 {self.es_host}:{self.es_port}')
# 连接到本地映射的 es 服务器
es_config = {"hosts": [{'host': 'localhost',
'port': 0,
'scheme': 'https'}],
"http_auth": (self.es_username, self.es_password),
"verify_certs": false}
# 获取ssh隧道映射到本地的端口
local_port = self.tunnel.local_bind_port
es_config['hosts'][0]['port'] = local_port # 更新elasticsearch主机配置中的端口号
# print(es_config)
self.es = elasticsearch(**es_config)
else:
logger.error('ssh 连接建立失败')
return self
except exception as e:
logger.error(f"发生错误: {e}")
def __exit__(self, exc_type, exc_val, exc_tb):
if self.es:
self.es.close()
self.es = none
if self.tunnel:
self.tunnel.stop()
self.tunnel = none
def get_value(self, index: str, body, verbose=2):
start_time = time.time()
try:
value = self.es.search(index=index, body=body)
if verbose == 2:
logger.info(
f'>> [es] 获取body的value成功, body: {body}, value: {value}, 耗时: {time.time() - start_time:.2}s')
elif verbose == 1:
logger.info(f'>> [es] 获取body的value成功, key: {body}, 耗时: {time.time() - start_time:.2}s')
return value
except exception as e:
err = traceback.format_exc()
logger.error(f'>> [es] 获取value异常, key: {body}, error: {e}, traceback: {err} 耗时: {time.time() - start_time:.2}s')
return none
if __name__ == '__main__':
with sshesclient(
**readyaml(os.path.join(config.test_datas_dir, "es连接账号.yaml"), part="sit_es").read()[0]) as es_client:
print('es_client',es_client)
query = {"query": {
"match_all": {}
}
}
result = es_client.get_value(index="hsrh_es_platform_product_0", body=query)
发表评论