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 功能,提供简化的接口
|
/// 基于现有的 search_similar_outfits 功能,提供简化的接口
|
||||||
|
|
||||||
/// 快速相似度搜索
|
/// 快速相似度搜索
|
||||||
/// 使用预设配置进行简化搜索
|
/// 支持高级过滤器配置的相似度搜索
|
||||||
#[command]
|
#[command]
|
||||||
pub async fn quick_similarity_search(
|
pub async fn quick_similarity_search(
|
||||||
state: State<'_, AppState>,
|
state: State<'_, AppState>,
|
||||||
|
|
@ -16,8 +16,9 @@ pub async fn quick_similarity_search(
|
||||||
relevance_threshold: Option<String>,
|
relevance_threshold: Option<String>,
|
||||||
page_size: Option<usize>,
|
page_size: Option<usize>,
|
||||||
page_offset: Option<usize>,
|
page_offset: Option<usize>,
|
||||||
|
config: Option<SearchConfig>,
|
||||||
) -> Result<SearchResponse, String> {
|
) -> Result<SearchResponse, String> {
|
||||||
// 构建默认搜索配置
|
// 构建搜索配置 - 使用传入的配置或创建默认配置
|
||||||
let threshold = match relevance_threshold.as_deref() {
|
let threshold = match relevance_threshold.as_deref() {
|
||||||
Some("LOWEST") => RelevanceThreshold::Lowest,
|
Some("LOWEST") => RelevanceThreshold::Lowest,
|
||||||
Some("LOW") => RelevanceThreshold::Low,
|
Some("LOW") => RelevanceThreshold::Low,
|
||||||
|
|
@ -26,8 +27,8 @@ pub async fn quick_similarity_search(
|
||||||
_ => RelevanceThreshold::Medium, // 默认使用中等阈值
|
_ => RelevanceThreshold::Medium, // 默认使用中等阈值
|
||||||
};
|
};
|
||||||
|
|
||||||
let config = SearchConfig {
|
let mut final_config = config.unwrap_or_else(|| SearchConfig {
|
||||||
relevance_threshold: threshold,
|
relevance_threshold: threshold.clone(),
|
||||||
environments: Vec::new(),
|
environments: Vec::new(),
|
||||||
categories: Vec::new(),
|
categories: Vec::new(),
|
||||||
color_filters: std::collections::HashMap::new(),
|
color_filters: std::collections::HashMap::new(),
|
||||||
|
|
@ -37,18 +38,32 @@ pub async fn quick_similarity_search(
|
||||||
custom_filters: Vec::new(),
|
custom_filters: Vec::new(),
|
||||||
query_enhancement_enabled: true,
|
query_enhancement_enabled: true,
|
||||||
color_thresholds: ColorThresholds::default(),
|
color_thresholds: ColorThresholds::default(),
|
||||||
};
|
});
|
||||||
|
|
||||||
|
// 确保阈值与传入的参数一致
|
||||||
|
final_config.relevance_threshold = threshold;
|
||||||
|
|
||||||
let request = SearchRequest {
|
let request = SearchRequest {
|
||||||
query: query.clone(),
|
query: query.clone(),
|
||||||
config,
|
config: final_config.clone(),
|
||||||
page_size: page_size.unwrap_or(12), // 工具页面显示更多结果,支持自定义
|
page_size: page_size.unwrap_or(12), // 工具页面显示更多结果,支持自定义
|
||||||
page_offset: page_offset.unwrap_or(0), // 支持分页偏移
|
page_offset: page_offset.unwrap_or(0), // 支持分页偏移
|
||||||
};
|
};
|
||||||
|
|
||||||
// 调试信息
|
// 调试信息
|
||||||
|
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={}",
|
eprintln!("相似度搜索请求: query='{}', page_size={}, page_offset={}",
|
||||||
query, request.page_size, request.page_offset);
|
query, request.page_size, request.page_offset);
|
||||||
|
}
|
||||||
|
|
||||||
// 复用现有的搜索功能
|
// 复用现有的搜索功能
|
||||||
search_similar_outfits(state, request).await
|
search_similar_outfits(state, request).await
|
||||||
|
|
|
||||||
|
|
@ -94,8 +94,13 @@ const SimilaritySearchTool: React.FC = () => {
|
||||||
|
|
||||||
// 处理搜索
|
// 处理搜索
|
||||||
const handleSearch = useCallback((request: SimilaritySearchRequest) => {
|
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) => {
|
const handleSuggestionSelect = useCallback((suggestion: string) => {
|
||||||
|
|
@ -112,6 +117,7 @@ const SimilaritySearchTool: React.FC = () => {
|
||||||
relevance_threshold: selectedThreshold,
|
relevance_threshold: selectedThreshold,
|
||||||
page_size: configState.config?.max_results_per_page || 12,
|
page_size: configState.config?.max_results_per_page || 12,
|
||||||
page_offset: 0,
|
page_offset: 0,
|
||||||
|
config: newConfig, // 包含高级过滤器配置
|
||||||
};
|
};
|
||||||
executeSearch(request);
|
executeSearch(request);
|
||||||
}
|
}
|
||||||
|
|
@ -164,14 +170,17 @@ const SimilaritySearchTool: React.FC = () => {
|
||||||
|
|
||||||
// 监听相关性阈值变化,立即重新搜索
|
// 监听相关性阈值变化,立即重新搜索
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
if (query.trim()) { // 只有在有查询内容时才搜索
|
||||||
const request: SimilaritySearchRequest = {
|
const request: SimilaritySearchRequest = {
|
||||||
query: query.trim(),
|
query: query.trim(),
|
||||||
relevance_threshold: selectedThreshold,
|
relevance_threshold: selectedThreshold,
|
||||||
page_size: configState.config?.max_results_per_page || 12,
|
page_size: configState.config?.max_results_per_page || 12,
|
||||||
page_offset: (searchState.currentPage - 1) * (configState.config?.max_results_per_page || 12),
|
page_offset: (searchState.currentPage - 1) * (configState.config?.max_results_per_page || 12),
|
||||||
|
config: searchConfig, // 包含高级过滤器配置
|
||||||
};
|
};
|
||||||
executeSearch(request);
|
executeSearch(request);
|
||||||
}, [selectedThreshold]); // 只监听阈值变化
|
}
|
||||||
|
}, [selectedThreshold, searchConfig]); // 监听阈值和高级过滤器配置变化
|
||||||
|
|
||||||
// 返回工具列表
|
// 返回工具列表
|
||||||
const handleBackToTools = useCallback(() => {
|
const handleBackToTools = useCallback(() => {
|
||||||
|
|
@ -245,10 +254,11 @@ const SimilaritySearchTool: React.FC = () => {
|
||||||
relevance_threshold: selectedThreshold,
|
relevance_threshold: selectedThreshold,
|
||||||
page_size: configState.config?.max_results_per_page || 12,
|
page_size: configState.config?.max_results_per_page || 12,
|
||||||
page_offset: 0,
|
page_offset: 0,
|
||||||
|
config: searchConfig, // 包含高级过滤器配置
|
||||||
};
|
};
|
||||||
|
|
||||||
executeSearch(searchRequest);
|
executeSearch(searchRequest);
|
||||||
}, [selectedThreshold, configState.config?.max_results_per_page, executeSearch, setQuery]);
|
}, [selectedThreshold, configState.config?.max_results_per_page, executeSearch, setQuery, searchConfig]);
|
||||||
|
|
||||||
// 关闭穿搭方案模态框
|
// 关闭穿搭方案模态框
|
||||||
const handleCloseOutfitModal = useCallback(() => {
|
const handleCloseOutfitModal = useCallback(() => {
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ export class SimilaritySearchService {
|
||||||
relevanceThreshold: request.relevance_threshold,
|
relevanceThreshold: request.relevance_threshold,
|
||||||
pageSize: request.page_size,
|
pageSize: request.page_size,
|
||||||
pageOffset: request.page_offset,
|
pageOffset: request.page_offset,
|
||||||
|
config: request.config, // 传递高级过滤器配置
|
||||||
});
|
});
|
||||||
return response;
|
return response;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// 重用现有的搜索结果类型
|
// 重用现有的搜索结果类型
|
||||||
import type { SearchResult, SearchResponse } from './outfitSearch';
|
import type { SearchResult, SearchResponse, SearchConfig } from './outfitSearch';
|
||||||
export type { SearchResult, SearchResponse };
|
export type { SearchResult, SearchResponse, SearchConfig };
|
||||||
|
|
||||||
// 阈值选项
|
// 阈值选项
|
||||||
export interface ThresholdOption {
|
export interface ThresholdOption {
|
||||||
|
|
@ -22,12 +22,13 @@ export interface SimilaritySearchConfig {
|
||||||
quick_search_tags: string[];
|
quick_search_tags: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 搜索请求(简化版)
|
// 搜索请求(扩展版,支持高级过滤器)
|
||||||
export interface SimilaritySearchRequest {
|
export interface SimilaritySearchRequest {
|
||||||
query: string;
|
query: string;
|
||||||
relevance_threshold?: string;
|
relevance_threshold?: string;
|
||||||
page_size?: number;
|
page_size?: number;
|
||||||
page_offset?: number;
|
page_offset?: number;
|
||||||
|
config?: SearchConfig; // 添加高级过滤器配置支持
|
||||||
}
|
}
|
||||||
|
|
||||||
// 搜索状态
|
// 搜索状态
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue