feat: 以图搜图功能升级(跨表UNION检索 + 拍照识图入口 + 批量向量初始化脚本)

This commit is contained in:
DXC
2026-05-21 15:43:45 +08:00
parent 1a7c06f197
commit c273f5a9d9
4 changed files with 304 additions and 45 deletions

View File

@ -71,19 +71,45 @@ def image_search():
print(f"⚠️ [ImageSearch] 临时文件删除失败: {e}")
# ---------------------------------------------------------
# 5. pgvector 余弦相似度检索
# 5. pgvector 余弦相似度检索(跨表联合检索)
# ---------------------------------------------------------
try:
# 将 Python list 转为 PostgreSQL 向量格式: '[0.1, 0.2, ...]'
query_vector_str = '[' + ','.join(str(v) for v in embedding) + ']'
sql = text("""
SELECT id, name, spec_model, product_image,
(1 - (img_embedding <=> :query_vector)) AS similarity
FROM material_base
WHERE img_embedding IS NOT NULL
ORDER BY img_embedding <=> :query_vector
LIMIT 5
SELECT id, name, spec_model, image_url,
(1 - (vec <=> :query_vector)) AS similarity
FROM (
SELECT id,
COALESCE(name, '') AS name,
COALESCE(spec, '') AS spec_model,
COALESCE(product_image, '') AS image_url,
img_embedding AS vec
FROM material_base
WHERE img_embedding IS NOT NULL
UNION ALL
SELECT id,
'采购入库' AS name,
'到货照片' AS spec_model,
COALESCE(arrival_photo, '') AS image_url,
arrival_image_embedding AS vec
FROM stock_buy
WHERE arrival_image_embedding IS NOT NULL
UNION ALL
SELECT id,
'采购入库' AS name,
'质检报告' AS spec_model,
COALESCE(qc_report, '') AS image_url,
qc_report_image_embedding AS vec
FROM stock_buy
WHERE qc_report_image_embedding IS NOT NULL
) AS combined
ORDER BY vec <=> :query_vector
LIMIT 10
""")
result = db.session.execute(sql, {"query_vector": query_vector_str})
@ -91,30 +117,31 @@ def image_search():
results = []
for row in rows:
product_id = row[0]
product_name = row[1] or ""
item_id = row[0]
item_name = row[1] or ""
spec_model = row[2] or ""
product_image = row[3]
raw_image = row[3]
# 解析图片 URL 列表,取第一张
image_url = ""
if product_image:
if raw_image:
try:
image_list = json.loads(product_image)
image_list = json.loads(raw_image)
if image_list and len(image_list) > 0:
image_url = image_list[0]
except Exception:
image_url = str(product_image)
# 纯字符串直接使用
image_url = str(raw_image)
results.append({
"product_id": product_id,
"product_name": product_name,
"id": item_id,
"name": item_name,
"spec_model": spec_model,
"image_url": image_url,
"similarity": round(float(row[4]), 4)
})
print(f"✅ [ImageSearch] 检索完成,命中 {len(results)} 条结果")
print(f"✅ [ImageSearch] 跨表检索完成,命中 {len(results)} 条结果")
return jsonify({
"code": 200,
"msg": "检索成功",