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:
parent
a1c40a13ad
commit
0a89efd394
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(() => {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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; // 添加高级过滤器配置支持
|
||||
}
|
||||
|
||||
// 搜索状态
|
||||
|
|
|
|||
Loading…
Reference in New Issue