mickeywu520 commited on
Commit
d2d7682
·
1 Parent(s): 85ef28f

修正查詢

Browse files
backend/services/enhanced_product_service.py CHANGED
@@ -51,19 +51,29 @@ class EnhancedProductService:
51
  joinedload(Product.category)
52
  ).filter(Product.is_deleted == False)
53
 
54
- # 關鍵字搜尋 - 支援商品名稱、編號、條碼
55
  if query_text:
56
  logger.info(f"🔑 使用關鍵字搜尋: '{query_text}'")
57
- search_terms = query_text.strip().split()
58
- logger.info(f"📝 分割的搜尋詞: {search_terms}")
59
-
60
- for term in search_terms:
61
- search_filter = or_(
62
- Product.productName.ilike(f"%{term}%"),
63
- Product.productCode.ilike(f"%{term}%"),
64
- Product.barcode.ilike(f"%{term}%")
65
- )
66
- query = query.filter(search_filter)
 
 
 
 
 
 
 
 
 
 
67
 
68
  # 分類篩選
69
  if category_name:
 
51
  joinedload(Product.category)
52
  ).filter(Product.is_deleted == False)
53
 
54
+ # 關鍵字搜尋 - 使用智能關鍵字提取
55
  if query_text:
56
  logger.info(f"🔑 使用關鍵字搜尋: '{query_text}'")
57
+
58
+ # 使用智能關鍵字提取方法
59
+ search_terms = self._extract_keywords(query_text)
60
+ logger.info(f"📝 智能提取的關鍵字: {search_terms}")
61
+
62
+ if search_terms:
63
+ # 建立搜尋條件 - 使用 OR 邏輯
64
+ search_filters = []
65
+ for term in search_terms:
66
+ search_filters.extend([
67
+ Product.productName.ilike(f"%{term}%"),
68
+ Product.productCode.ilike(f"%{term}%"),
69
+ Product.barcode.ilike(f"%{term}%")
70
+ ])
71
+
72
+ if search_filters:
73
+ query = query.filter(or_(*search_filters))
74
+ logger.info(f"✅ 應用了 {len(search_filters)} 個搜尋條件")
75
+ else:
76
+ logger.warning(f"⚠️ 沒有提取到有效關鍵字")
77
 
78
  # 分類篩選
79
  if category_name:
test_quick_fix.py ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ 快速測試關鍵字提取修復
3
+ """
4
+
5
+ def test_keyword_extraction_fix():
6
+ """測試修復後的關鍵字提取"""
7
+
8
+ def extract_keywords_fixed(query_text: str):
9
+ """修復後的關鍵字提取邏輯"""
10
+ # 移除常見的查詢詞彙
11
+ stop_words = ['推薦', '有沒有', '是否有', '請問', '想要', '需要', '找', '查詢', '搜尋', '還有嗎', '還有', '嗎', '可以']
12
+
13
+ # 清理查詢文字
14
+ cleaned_text = query_text.replace('?', '').replace('?', '').strip()
15
+
16
+ # 先嘗試提取核心商品詞彙
17
+ core_product_words = ['貓砂', '狗糧', '寵物', '商品', '產品', '貓', '狗', '犬', '礦砂']
18
+ extracted_core_words = []
19
+
20
+ for core_word in core_product_words:
21
+ if core_word in cleaned_text:
22
+ extracted_core_words.append(core_word)
23
+
24
+ # 分割並清理關鍵字
25
+ words = cleaned_text.split()
26
+ keywords = []
27
+
28
+ for word in words:
29
+ if word not in stop_words and len(word) > 1:
30
+ keywords.append(word)
31
+
32
+ # 合併核心詞彙和分割的關鍵字
33
+ all_keywords = list(set(extracted_core_words + keywords))
34
+
35
+ # 如果沒有有效關鍵字,使用清理後的文字
36
+ if not all_keywords:
37
+ all_keywords = [cleaned_text]
38
+
39
+ # 擴展相關關鍵字
40
+ expanded_keywords = []
41
+ for keyword in all_keywords:
42
+ expanded_keywords.append(keyword)
43
+
44
+ # 貓砂相關擴展
45
+ if '貓砂' in keyword or '貓' in keyword:
46
+ expanded_keywords.extend(['礦砂', '豆腐砂', '水晶砂', '木屑砂', 'litter', '貓砂'])
47
+
48
+ # 狗糧相關擴展
49
+ if '狗糧' in keyword or '狗' in keyword:
50
+ expanded_keywords.extend(['犬糧', '犬種', '狗食', 'dog'])
51
+
52
+ # 寵物相關擴展
53
+ if '寵物' in keyword:
54
+ expanded_keywords.extend(['貓', '狗', '犬', 'pet', 'cat'])
55
+
56
+ # 商品相關擴展
57
+ if '商品' in keyword or '產品' in keyword:
58
+ expanded_keywords.extend(['貓砂', '狗糧', '寵物', '食品', '用品'])
59
+
60
+ # 去除重複並返回
61
+ unique_keywords = list(set(expanded_keywords))
62
+
63
+ return unique_keywords, extracted_core_words
64
+
65
+ print("🔧 測試關鍵字提取修復")
66
+ print("=" * 50)
67
+
68
+ # 測試實際的問題查詢
69
+ test_queries = [
70
+ "貓砂還有嗎?",
71
+ "請問貓砂還有嗎?"
72
+ ]
73
+
74
+ for query in test_queries:
75
+ print(f"\n查詢: '{query}'")
76
+ keywords, core_words = extract_keywords_fixed(query)
77
+ print(f" 核心詞彙: {core_words}")
78
+ print(f" 最終關鍵字: {keywords}")
79
+
80
+ # 檢查是否包含預期的關鍵字
81
+ if '貓砂' in keywords and '礦砂' in keywords:
82
+ print(" ✅ 包含預期的貓砂相關關鍵字")
83
+ else:
84
+ print(" ❌ 缺少預期的關鍵字")
85
+
86
+ def test_search_logic_simulation():
87
+ """模擬搜尋邏輯"""
88
+
89
+ print(f"\n🔍 模擬搜尋邏輯")
90
+ print("=" * 50)
91
+
92
+ # 實際商品資料
93
+ products = [
94
+ {
95
+ "productName": "美國極冠貓砂 薰衣草12kg",
96
+ "productCode": "TL-03",
97
+ "stock": 48
98
+ },
99
+ {
100
+ "productName": "Shovel well豪好鏟 破碎型礦砂",
101
+ "productCode": "SW-06-01",
102
+ "stock": 50
103
+ }
104
+ ]
105
+
106
+ # 修復後的關鍵字
107
+ keywords = ['貓砂', '礦砂', '豆腐砂', '水晶砂', '木屑砂', 'litter', '貓']
108
+
109
+ print(f"使用關鍵字: {keywords}")
110
+
111
+ matched_products = []
112
+
113
+ for product in products:
114
+ product_name_lower = product["productName"].lower()
115
+ product_code_lower = product["productCode"].lower()
116
+
117
+ # 檢查是否匹配任一關鍵字
118
+ for keyword in keywords:
119
+ keyword_lower = keyword.lower()
120
+
121
+ if (keyword_lower in product_name_lower or
122
+ keyword_lower in product_code_lower):
123
+ matched_products.append(product)
124
+ print(f"✅ 匹配: {product['productName']} (關鍵字: '{keyword}')")
125
+ break
126
+
127
+ print(f"\n總共匹配 {len(matched_products)} 個商品")
128
+
129
+ if len(matched_products) >= 2:
130
+ print("✅ 修復成功!應該能找到貓砂商品了")
131
+ else:
132
+ print("❌ 仍有問題需要進一步調試")
133
+
134
+ def main():
135
+ """主函數"""
136
+ print("🚀 快速測試關鍵字提取修復")
137
+ print("=" * 60)
138
+
139
+ test_keyword_extraction_fix()
140
+ test_search_logic_simulation()
141
+
142
+ print("\n" + "=" * 60)
143
+ print("✅ 測試完成!")
144
+ print("\n💡 修復重點:")
145
+ print("1. search_products_advanced 現在使用 _extract_keywords 方法")
146
+ print("2. 不再直接使用 query_text.split()")
147
+ print("3. 應用 OR 邏輯搜尋條件")
148
+ print("4. 重啟服務後應該能正常工作")
149
+
150
+ if __name__ == "__main__":
151
+ main()