fix: resolve advanced filter data flow issue in similarity search

**Root Cause Fixed**: Advanced filter conditions were not being applied because:
- SimilaritySearchRequest lacked config field for SearchConfig
- Backend quick_similarity_search created empty default config
- Frontend searchConfig state was not passed to search requests

 **Changes Made**:

**Frontend Fixes:**
- Extended SimilaritySearchRequest interface with optional config field
- Modified SimilaritySearchService to pass config parameter
- Updated all search calls in SimilaritySearchTool to include searchConfig
- Enhanced handleSearch, threshold change listener, and scene search

**Backend Fixes:**
- Added config parameter to quick_similarity_search command
- Implemented config merging logic (use provided config or create default)
- Added comprehensive debug logging for filter configuration
- Fixed Rust compilation error with threshold.clone()

**Data Flow Now Working:**
Frontend SearchConfig  SimilaritySearchRequest.config  Backend SearchRequest  Filter Application

**Testing:**
-  Frontend builds successfully
-  Backend compiles without errors
-  Advanced filters now properly transmitted to search engine
-  Debug mode shows filter details in console

Advanced filter conditions now properly affect similarity search results!
This commit is contained in:
imeepos 2025-07-25 12:52:15 +08:00
parent a1c40a13ad
commit 0a89efd394
4 changed files with 49 additions and 22 deletions

View File

@ -8,7 +8,7 @@ use crate::presentation::commands::outfit_search_commands::search_similar_outfit
/// 基于现有的 search_similar_outfits 功能,提供简化的接口
/// 快速相似度搜索
/// 使用预设配置进行简化搜索
/// 支持高级过滤器配置的相似度搜索
#[command]
pub async fn quick_similarity_search(
state: State<'_, AppState>,
@ -16,8 +16,9 @@ pub async fn quick_similarity_search(
relevance_threshold: Option<String>,
page_size: Option<usize>,
page_offset: Option<usize>,
config: Option<SearchConfig>,
) -> Result<SearchResponse, String> {
// 构建默认搜索配置
// 构建搜索配置 - 使用传入的配置或创建默认配置
let threshold = match relevance_threshold.as_deref() {
Some("LOWEST") => RelevanceThreshold::Lowest,
Some("LOW") => RelevanceThreshold::Low,
@ -26,8 +27,8 @@ pub async fn quick_similarity_search(
_ => RelevanceThreshold::Medium, // 默认使用中等阈值
};
let config = SearchConfig {
relevance_threshold: threshold,
let mut final_config = config.unwrap_or_else(|| SearchConfig {
relevance_threshold: threshold.clone(),
environments: Vec::new(),
categories: Vec::new(),
color_filters: std::collections::HashMap::new(),
@ -37,18 +38,32 @@ pub async fn quick_similarity_search(
custom_filters: Vec::new(),
query_enhancement_enabled: true,
color_thresholds: ColorThresholds::default(),
};
});
// 确保阈值与传入的参数一致
final_config.relevance_threshold = threshold;
let request = SearchRequest {
query: query.clone(),
config,
config: final_config.clone(),
page_size: page_size.unwrap_or(12), // 工具页面显示更多结果,支持自定义
page_offset: page_offset.unwrap_or(0), // 支持分页偏移
};
// 调试信息
eprintln!("相似度搜索请求: query='{}', page_size={}, page_offset={}",
query, request.page_size, request.page_offset);
if final_config.debug_mode {
eprintln!("相似度搜索请求详情:");
eprintln!(" 查询: '{}'", query);
eprintln!(" 页面大小: {}", request.page_size);
eprintln!(" 页面偏移: {}", request.page_offset);
eprintln!(" 类别过滤: {:?}", final_config.categories);
eprintln!(" 环境过滤: {:?}", final_config.environments);
eprintln!(" 设计风格: {:?}", final_config.design_styles);
eprintln!(" 颜色过滤: {}", final_config.color_filters.len());
} else {
eprintln!("相似度搜索请求: query='{}', page_size={}, page_offset={}",
query, request.page_size, request.page_offset);
}
// 复用现有的搜索功能
search_similar_outfits(state, request).await

View File

@ -94,8 +94,13 @@ const SimilaritySearchTool: React.FC = () => {
// 处理搜索
const handleSearch = useCallback((request: SimilaritySearchRequest) => {
executeSearch(request);
}, [executeSearch]);
// 确保搜索请求包含当前的高级过滤器配置
const enhancedRequest: SimilaritySearchRequest = {
...request,
config: request.config || searchConfig, // 使用传入的配置或当前的高级过滤器配置
};
executeSearch(enhancedRequest);
}, [executeSearch, searchConfig]);
// 处理建议选择
const handleSuggestionSelect = useCallback((suggestion: string) => {
@ -112,6 +117,7 @@ const SimilaritySearchTool: React.FC = () => {
relevance_threshold: selectedThreshold,
page_size: configState.config?.max_results_per_page || 12,
page_offset: 0,
config: newConfig, // 包含高级过滤器配置
};
executeSearch(request);
}
@ -164,14 +170,17 @@ const SimilaritySearchTool: React.FC = () => {
// 监听相关性阈值变化,立即重新搜索
useEffect(() => {
const request: SimilaritySearchRequest = {
query: query.trim(),
relevance_threshold: selectedThreshold,
page_size: configState.config?.max_results_per_page || 12,
page_offset: (searchState.currentPage - 1) * (configState.config?.max_results_per_page || 12),
};
executeSearch(request);
}, [selectedThreshold]); // 只监听阈值变化
if (query.trim()) { // 只有在有查询内容时才搜索
const request: SimilaritySearchRequest = {
query: query.trim(),
relevance_threshold: selectedThreshold,
page_size: configState.config?.max_results_per_page || 12,
page_offset: (searchState.currentPage - 1) * (configState.config?.max_results_per_page || 12),
config: searchConfig, // 包含高级过滤器配置
};
executeSearch(request);
}
}, [selectedThreshold, searchConfig]); // 监听阈值和高级过滤器配置变化
// 返回工具列表
const handleBackToTools = useCallback(() => {
@ -245,10 +254,11 @@ const SimilaritySearchTool: React.FC = () => {
relevance_threshold: selectedThreshold,
page_size: configState.config?.max_results_per_page || 12,
page_offset: 0,
config: searchConfig, // 包含高级过滤器配置
};
executeSearch(searchRequest);
}, [selectedThreshold, configState.config?.max_results_per_page, executeSearch, setQuery]);
}, [selectedThreshold, configState.config?.max_results_per_page, executeSearch, setQuery, searchConfig]);
// 关闭穿搭方案模态框
const handleCloseOutfitModal = useCallback(() => {

View File

@ -20,6 +20,7 @@ export class SimilaritySearchService {
relevanceThreshold: request.relevance_threshold,
pageSize: request.page_size,
pageOffset: request.page_offset,
config: request.config, // 传递高级过滤器配置
});
return response;
} catch (error) {

View File

@ -4,8 +4,8 @@
*/
// 重用现有的搜索结果类型
import type { SearchResult, SearchResponse } from './outfitSearch';
export type { SearchResult, SearchResponse };
import type { SearchResult, SearchResponse, SearchConfig } from './outfitSearch';
export type { SearchResult, SearchResponse, SearchConfig };
// 阈值选项
export interface ThresholdOption {
@ -22,12 +22,13 @@ export interface SimilaritySearchConfig {
quick_search_tags: string[];
}
// 搜索请求(简化版
// 搜索请求(扩展版,支持高级过滤器
export interface SimilaritySearchRequest {
query: string;
relevance_threshold?: string;
page_size?: number;
page_offset?: number;
config?: SearchConfig; // 添加高级过滤器配置支持
}
// 搜索状态