From 3ffcd35093518dd5a15d03cdf0b71689c6f706ff Mon Sep 17 00:00:00 2001 From: dxc Date: Fri, 22 May 2026 11:40:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=98=E6=9B=B4V3.31?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=86=E5=9B=BE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/api/v1/common/image_search.py | 72 ++++++++++--------- inventory-web/.env.development | 7 +- 2 files changed, 42 insertions(+), 37 deletions(-) diff --git a/inventory-backend/app/api/v1/common/image_search.py b/inventory-backend/app/api/v1/common/image_search.py index 7204bf9..0213fda 100644 --- a/inventory-backend/app/api/v1/common/image_search.py +++ b/inventory-backend/app/api/v1/common/image_search.py @@ -77,40 +77,42 @@ def image_search(): query_vector_str = '[' + ','.join(str(v) for v in embedding) + ']' sql = text(""" - SELECT id, name, spec_model, image_url, - (1 - (vec <=> :query_vector)) AS similarity - FROM ( - -- 1. 基础物料表 - SELECT id, name, spec_model, product_image AS image_url, img_embedding AS vec - FROM material_base - WHERE img_embedding IS NOT NULL - - UNION ALL - - -- 2. 采购入库表 (通过 base_id 关联拿真实物料) - SELECT mb.id, mb.name, mb.spec_model, sb.arrival_photo AS image_url, sb.arrival_image_embedding AS vec - FROM stock_buy sb - JOIN material_base mb ON sb.base_id = mb.id - WHERE sb.arrival_image_embedding IS NOT NULL - - UNION ALL - - -- 3. 半成品入库表 - SELECT mb.id, mb.name, mb.spec_model, ss.arrival_photo AS image_url, ss.arrival_image_embedding AS vec - FROM stock_semi ss - JOIN material_base mb ON ss.base_id = mb.id - WHERE ss.arrival_image_embedding IS NOT NULL - - UNION ALL - - -- 4. 成品入库表 - SELECT mb.id, mb.name, mb.spec_model, sp.product_photo AS image_url, sp.arrival_image_embedding AS vec - FROM stock_product sp - JOIN material_base mb ON sp.base_id = mb.id - WHERE sp.arrival_image_embedding IS NOT NULL - ) AS combined - ORDER BY vec <=> :query_vector LIMIT 10 - """) + SELECT id, name, spec_model, image_url, + (1 - (vec <=> :query_vector)) AS similarity + FROM ( + -- 1. 基础物料表 + SELECT id, name, spec_model, product_image AS image_url, img_embedding AS vec + FROM material_base + WHERE img_embedding IS NOT NULL + + UNION ALL + + -- 2. 采购入库表 (通过 base_id 关联拿真实物料信息) + SELECT mb.id, mb.name, mb.spec_model, sb.arrival_photo AS image_url, sb.arrival_image_embedding AS vec + FROM stock_buy sb + JOIN material_base mb ON sb.base_id = mb.id + WHERE sb.arrival_image_embedding IS NOT NULL + + UNION ALL + + -- 3. 半成品入库表 (通过 base_id 关联拿真实物料信息) + SELECT mb.id, mb.name, mb.spec_model, ss.arrival_photo AS image_url, ss.arrival_image_embedding AS vec + FROM stock_semi ss + JOIN material_base mb ON ss.base_id = mb.id + WHERE ss.arrival_image_embedding IS NOT NULL + + UNION ALL + + -- 4. 成品入库表 (通过 base_id 关联拿真实物料信息) + SELECT mb.id, mb.name, mb.spec_model, sp.product_photo AS image_url, sp.arrival_image_embedding AS vec + FROM stock_product sp + JOIN material_base mb ON sp.base_id = mb.id + WHERE sp.arrival_image_embedding IS NOT NULL + ) AS combined + + -- 核心:计算余弦距离并排序,取最接近的前 50 个! + ORDER BY vec <=> :query_vector LIMIT 50 +""") # 执行查询 records = db.session.execute(sql, {"query_vector": query_vector_str}).fetchall() @@ -150,7 +152,7 @@ def image_search(): "similarity": round(float(row.similarity), 4) }) - # 【新增】只要凑够了 10 个完全不同的物料,就立刻结束循环 + # 修改后:只要凑够了 10 个完全不同的物料,就立刻结束循环 if len(results) >= 10: break diff --git a/inventory-web/.env.development b/inventory-web/.env.development index 0b9e90e..4d2f574 100644 --- a/inventory-web/.env.development +++ b/inventory-web/.env.development @@ -1,3 +1,6 @@ # .env.development -# 注意:这里必须写你电脑的局域网 IP -VITE_API_BASE_URL=http://172.16.0.95:8000/api/v1 \ No newline at end of file +# 1. 本地局域网测试用(比如让平板连 192.168.9.33) +#VITE_API_BASE_URL=http://192.168.9.33:8000/api/v1 + +# 2. 服务器环境用(推送到服务器前,把上面那行注释掉,这行解开) + VITE_API_BASE_URL=http://172.16.0.95:8000/api/v1 \ No newline at end of file