server returned HTTP status503 Service Unavailable

博客内容涉及一个网络连接问题,尝试连接172.16.34.231:10250时遇到'无路由到主机'的错误。这可能是由于网络配置、防火墙限制或服务器宕机导致的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://172.16.34.130:30090/targets
在这里插入图片描述

 dialing backend: dial tcp 172.16.34.231:10250: connect: no route to host
import logging from flask import Flask, request, jsonify import numpy as np import requests import time from pymilvus import ( Collection, connections, utility, AnnSearchRequest, # 添加这个导入 Function, FunctionType, # 添加这个导入 WeightedRanker # 添加这个导入 ) from config.config1 import MILVUS_CONFIG, MODEL_CONFIG # 初始化日志 logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", handlers=[ logging.FileHandler("logs/classfication_query.log"), logging.StreamHandler() ] ) logger = logging.getLogger("ClassficationQuery") app = Flask(__name__) class VectorServiceClient: """HTTP调用模型服务进行向量编码(密集和稀疏)""" def __init__(self): self.service_url = MODEL_CONFIG["model_service_url"] self.timeout = 120 logger.info(f"Using vector service: {self.service_url}") def batch_encode_dense(self, texts): """批量生成密集向量""" return self._call_vector_service(texts, "dense") def batch_encode_sparse(self, texts): """批量生成稀疏向量""" return self._call_vector_service(texts, "sparse") def _call_vector_service(self, texts, vector_type): """调用向量服务通用方法""" try: if not texts: return [] payload = { "texts": texts, "type": vector_type } response = requests.post( self.service_url, headers={"Content-Type": "application/json"}, json=payload, timeout=self.timeout ) if response.status_code >= 400: error_detail = f"HTTP {response.status_code} Error: " try: error_detail += response.json().get("error", response.text[:500]) except: error_detail += response.text[:500] logger.error(f"{vector_type} service error: {error_detail}") response.raise_for_status() result = response.json() if "error" in result: logger.error(f"Vector service error ({vector_type}): {result['error']}") raise ValueError(result["error"]) if "vectors" not in result: logger.error(f"Invalid response from {vector_type} service: vectors not found") raise ValueError(f"Invalid response from {vector_type} service") return result["vectors"] except requests.exceptions.RequestException as e: logger.error(f"Request to {vector_type} service failed: {str(e)}") raise except Exception as e: logger.error(f"Encoding via {vector_type} service failed: {str(e)}") raise class ClassficationSearchHandler: """特征值搜索处理器""" def __init__(self): self.vector_service = VectorServiceClient() self.collection = None self.connect() self.load_collection() def connect(self): """连接Milvus数据库""" try: connections.connect( host=MILVUS_CONFIG["host"], port=MILVUS_CONFIG["port"] ) logger.info(f"Connected to Milvus: {MILVUS_CONFIG['host']}") except Exception as e: logger.error(f"Milvus connection failed: {str(e)}") raise def load_collection(self): """加载集合""" collection_name = MILVUS_CONFIG["collection_name"] try: if not utility.has_collection(collection_name): logger.error(f"Collection {collection_name} does not exist") raise ValueError(f"Collection {collection_name} not found") self.collection = Collection(collection_name) self.collection.load() logger.info(f"Loaded collection: {collection_name}") except Exception as e: logger.error(f"Failed to load collection: {str(e)}") raise def hybrid_search(self, query_text, top_k=5, dense_weight=0.5, sparse_weight=0.5): """ 执行混合检索(密集向量 + 稀疏向量) 参数: query_text: 查询文本(特征值) top_k: 返回结果数量 dense_weight: 密集向量权重 sparse_weight: 稀疏向量权重 返回: 排序后的结果列表 """ start_time = time.time() # 1. 编码查询文本 try: logger.info(f"Encoding query text: '{query_text}'") # 编码密集向量 dense_vectors = self.vector_service.batch_encode_dense([query_text]) if not dense_vectors or len(dense_vectors) == 0: logger.error("Dense vector encoding returned empty result") return [] dense_vector = dense_vectors[0] logger.info(f"Dense vector generated, length: {len(dense_vector)}") # 编码稀疏向量 sparse_vectors = self.vector_service.batch_encode_sparse([query_text]) if not sparse_vectors or len(sparse_vectors) == 0: logger.error("Sparse vector encoding returned empty result") return [] sparse_vector = sparse_vectors[0] logger.info(f"Sparse vector generated, length: {len(sparse_vector)}") except Exception as e: logger.error(f"Vector encoding failed: {str(e)}") return [] # 2. 创建搜索请求对象 try: logger.info(f"dense_vector {dense_vector}") # 创建密集向量搜索请求 dense_search_req = AnnSearchRequest( data=[dense_vector], # 注意:需要是二维列表 anns_field="classfication_dense_vector", param={"metric_type": "IP", "params": {"nprobe": 16}}, limit=top_k * 3, # 获取更多候选结果用于融合 weight=dense_weight ) logger.info(f"dense_vector {sparse_vector}") # 创建稀疏向量搜索请求 sparse_search_req = AnnSearchRequest( data=[sparse_vector], # 注意:需要是二维列表 anns_field="classfication_sparse_vector", param={"metric_type": "IP", "params": {}}, # 稀疏向量不需要nprobe limit=top_k * 3, weight=sparse_weight ) # 3. 执行混合搜索 logger.info("Executing hybrid search...") start_search = time.time() ranker = Function( name="rrf", input_field_names=[], # Must be an empty list function_type=FunctionType.RERANK, params={ "reranker": "rrf", "k": 60 # Optional } ) # 执行混合搜索 results = self.collection.hybrid_search( [dense_search_req, sparse_search_req], # 搜索请求列表 rerank=ranker, # 重排策略 limit=top_k, # 最终返回结果数量 output_fields=["matnr", "matkl", "maktx", "classfication"] ) search_time = time.time() - start_search logger.info(f"Hybrid search completed in {search_time:.2f}s, found {len(results)} results") except Exception as e: logger.error(f"Hybrid search failed: {str(e)}", exc_info=True) return [] # 4. 处理并返回结果 formatted_results = [] for i, hit in enumerate(results): entity = hit.entity formatted_results.append({ "rank": i + 1, "matnr": entity.get("matnr", ""), "matkl": entity.get("matkl", ""), "maktx": entity.get("maktx", ""), "classfication": entity.get("classfication", ""), "score": hit.score }) # 记录前5个结果 if i < 5: logger.info(f"Result #{i + 1}: MATNR={entity.get('matnr')}, Score={hit.score:.4f}") total_time = time.time() - start_time logger.info(f"Total search time: {total_time:.2f}s") return formatted_results # 初始化搜索处理器 search_handler = ClassficationSearchHandler() @app.route('/query_similar_by_classfication', methods=['POST']) def query_similar_by_classfication(): """特征值相似度查询接口""" try: data = request.json if not data or "query_text" not in data: return jsonify({"error": "Missing 'query_text' parameter"}), 400 query_text = data["query_text"] top_k = data.get("top_k", 5) dense_weight = data.get("dense_weight", 0.5) sparse_weight = data.get("sparse_weight", 0.5) logger.info(f"New query: text='{query_text}', top_k={top_k}, " f"dense_weight={dense_weight}, sparse_weight={sparse_weight}") # 执行混合搜索 results = search_handler.hybrid_search( query_text, top_k=top_k, dense_weight=dense_weight, sparse_weight=sparse_weight ) if not results: logger.info("No results found") return jsonify({"results": []}) return jsonify({"results": results}) except Exception as e: logger.error(f"API error: {str(e)}", exc_info=True) return jsonify({"error": "Internal server error"}), 500 @app.route('/health', methods=['GET']) def health_check(): """健康检查端点""" try: # 检查Milvus连接 if not search_handler.collection: return jsonify({"status": "down", "reason": "Milvus not connected"}), 500 # 检查模型服务 try: response = requests.get(f"{MODEL_CONFIG['model_service_url']}/health", timeout=5) if response.status_code != 200: return jsonify({"status": "down", "reason": "Model service unavailable"}), 500 except Exception as e: return jsonify({"status": "down", "reason": f"Model service error: {str(e)}"}), 500 return jsonify({"status": "up"}), 200 except Exception as e: return jsonify({"status": "down", "reason": str(e)}), 500 if __name__ == '__main__': try: logger.info("Starting Classfication Query Service on 0.0.0.0:8081") app.run(host='0.0.0.0', port=2379, debug=False) except Exception as e: logger.error(f"Failed to start service: {str(e)}")这段代码报错Traceback (most recent call last): File "/data/material_sync/api/similarity_query1.py", line 173, in hybrid_search dense_search_req = AnnSearchRequest( TypeError: __init__() got an unexpected keyword argument 'weight' 2025-07-07 16:32:53,300 - INFO - No results found
最新发布
07-08
<think>我们正在解决一个Milvus hybrid search中AnnSearchRequest初始化报错的问题。错误信息是:TypeError: __init__() got an unexpected keyword argument 'weight' 根据错误信息,在初始化AnnSearchRequest时传递了未预期的关键字参数'weight'。 分析: 在Milvus中,AnnSearchRequest用于构建ANN搜索请求。根据错误,可能是我们在创建AnnSearchRequest实例时传递了一个名为'weight'的参数,但是该类的构造函数并不接受这个参数。 我们需要检查代码中创建AnnSearchRequest的部分,确保传递的参数与类定义匹配。 参考Milvus官方文档或源码,AnnSearchRequest的初始化参数通常包括: - collection_name: 集合名称 - data: 查询向量 - anns_field: 要搜索的向量字段名 - param: 搜索参数(如metric_type, topk等) - limit: 返回结果数量 - expression: 过滤表达式(可选) 注意:在hybrid search中,可能会使用多个AnnSearchRequest,然后通过权重组合结果。但是,权重参数通常不是在每个AnnSearchRequest中设置,而是在组合搜索时设置。 例如,在Milvus的hybrid search中,我们可能会这样使用: - 首先构建多个AnnSearchRequest(每个对应一个向量字段或一个查询) - 然后使用这些请求构建一个HybridSearchRequest,并在其中指定每个请求的权重(weight) 因此,错误提示我们在初始化AnnSearchRequest时传入了'weight',但正确的做法应该是在构建HybridSearchRequest时设置权重。 修正步骤: 1. 检查创建AnnSearchRequest的代码,移除其中可能存在的'weight'参数。 2. 在构建HybridSearchRequest时,通过`requests`参数传递AnnSearchRequest列表,并通过`weights`参数指定每个请求的权重(注意:weights是一个列表,与requests一一对应)。 示例代码(修正前): ```python # 错误的:在AnnSearchRequest中传入了weight request1 = AnnSearchRequest( data=query_vector1, anns_field="embedding1", param={"metric_type": "L2", "params": {"nprobe": 10}}, limit=10, weight=0.5 # 这是错误的 ) ``` 修正后: ```python request1 = AnnSearchRequest( data=query_vector1, anns_field="embedding1", param={"metric_type": "L2", "params": {"nprobe": 10}}, limit=10 ) request2 = AnnSearchRequest( data=query_vector2, anns_field="embedding2", param={"metric_type": "IP", "params": {"nprobe": 10}}, limit=10 ) # 然后在HybridSearchRequest中设置权重 hybrid_request = HybridSearchRequest( requests=[request1, request2], weights=[0.5, 0.5] # 这里设置权重 ) ``` 注意:HybridSearchRequest的weights参数是一个浮点数列表,长度必须与requests列表相同。 如果问题仍然存在,请检查Milvus的版本。hybrid search功能在Milvus 2.1.0及以上版本中支持,且API可能随版本变化。请确保使用的SDK版本与Milvus服务器版本兼容。 另外,请参考Milvus官方文档中关于Hybrid Search的部分: - https://milvus.io/docs/hybridsearch.md 如果按照上述步骤修正后问题解决,那么问题就出在参数传递的位置。 如果还有疑问,请提供相关代码片段以便进一步分析。 相关问题: 1. 如何正确设置Milvus的hybrid search中的权重? 2. Milvus hybrid search支持哪些类型的搜索请求? 3. 如何升级Milvus版本以支持hybrid search?</think>### Milvus AnnSearchRequest 初始化报错解决方案 您遇到的 `TypeError: __init__() got an unexpected keyword argument 'weight'` 错误,是由于在初始化 `AnnSearchRequest` 时错误地传递了 `weight` 参数导致的。以下是详细分析和解决方案: --- ### **错误原因分析** 1. **参数不匹配** `AnnSearchRequest` 的构造函数不接受 `weight` 参数。该参数属于 **hybrid search 的高级配置**,应在更高层级的 `HybridSearchRequest` 中设置。 2. **版本兼容性** 不同版本的 Milvus SDK 对参数要求可能不同。此错误常见于: - Milvus 2.2.x ~ 2.3.x - PyMilvus SDK 版本 ≥ 2.2.0 3. **官方文档验证** 根据 Milvus 最新文档 [^1],`AnnSearchRequest` 的有效参数为: ```python AnnSearchRequest( data: List[List[float]], # 查询向量 anns_field: str, # 向量字段名 param: dict, # 搜索参数(如nprobe) limit: int, # 返回结果数量 expr: Optional[str] = None # 过滤表达式 ) ``` --- ### **解决方案** #### 步骤 1:修正参数传递 移除 `AnnSearchRequest` 中的 `weight` 参数,将其移至 `HybridSearchRequest`: ```python from pymilvus import AnnSearchRequest, HybridSearchRequest # 正确构建 AnnSearchRequest(无 weight 参数) vector_req = AnnSearchRequest( data=query_vector, # 查询向量 anns_field="embeddings", # 向量字段名 param={"metric_type": "L2", "params": {"nprobe": 10}}, # 搜索参数 limit=3 # 返回数量 ) # 在 HybridSearchRequest 中设置权重 hybrid_request = HybridSearchRequest( requests=[vector_req], weights=[1.0] # 此处配置权重 ) ``` #### 步骤 2:检查 SDK 版本 ```bash pip show pymilvus # 查看当前版本 ``` - **推荐版本**:PyMilvus ≥ 2.2.2(修复了早期版本的 hybrid search 问题) - 升级命令: ```bash pip install --upgrade pymilvus==2.2.2 ``` #### 步骤 3:验证服务端版本 确保 Milvus 服务端版本 ≥ 2.2.0(hybrid search 的最低要求): ```bash docker logs <milvus_container> | grep "version" ``` - 若版本过低,需升级 Milvus 服务端 [^2]。 --- ### **关键注意事项** 1. **权重配置位置** - `AnnSearchRequest`:仅定义**单个搜索请求**(向量查询/标量过滤)。 - `HybridSearchRequest`:组合多个请求并分配权重,例如: ```python # 混合搜索:向量 + 标量过滤 vector_req = AnnSearchRequest(...) expr_req = AnnSearchRequest(expr="price < 100", ...) hybrid_request = HybridSearchRequest( requests=[vector_req, expr_req], weights=[0.8, 0.2] # 权重总和建议为1.0 ) ``` 2. **参数兼容性** 若使用旧版 SDK(< 2.2.0),需改用 `Collection.search()` 的 `data` 参数: ```python results = collection.hybrid_search( data=[query_vector], anns_field="embeddings", weight=0.7, # 旧版此处允许 weight ... ) ``` --- ### **完整示例代码** ```python from pymilvus import connections, AnnSearchRequest, HybridSearchRequest # 连接 Milvus connections.connect(host="localhost", port="19530") # 构建向量查询请求 vector_query = AnnSearchRequest( data=[[0.1, 0.2, ..., 0.8]], # 替换为实际向量 anns_field="embeddings", param={"metric_type": "IP", "params": {"nprobe": 16}}, limit=5 ) # 构建混合搜索请求(配置权重) hybrid_search = HybridSearchRequest( requests=[vector_query], weights=[1.0] ) # 执行搜索 results = collection.hybrid_search(hybrid_search) print(results[0].ids) # 输出结果 ``` --- ### **相关问题** 1. 如何为 Milvus 混合搜索中的不同字段设置差异化权重? 2. 如何解决 hybrid search 返回结果分数不一致的问题? 3. Milvus 混合搜索支持哪些类型的索引组合? [^1]: Milvus 官方文档中明确说明 `AnnSearchRequest` 的参数不包含 `weight`,该参数属于更高层级的混合搜索配置。 [^2]: Milvus 服务端版本升级需注意数据兼容性,建议在测试环境验证后再部署生产环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值