fix: respect dateStart/dateEnd filters in Chroma search path (#1343)
When a search query includes dateStart/dateEnd parameters, the Chroma semantic search path (PATH 2) ignored them entirely and only applied a hardcoded 90-day recency window. This meant date-filtered searches returned results from outside the requested range. Now the Chroma path checks for a user-provided dateRange first. If present, it filters results by the requested start/end bounds. The 90-day window is only used as the default when no date filter is specified, preserving backward compatibility. Fixes #1324 Signed-off-by: umut-polat <52835619+umut-polat@users.noreply.github.com>
This commit is contained in:
@@ -180,15 +180,37 @@ export class SearchManager {
|
|||||||
logger.debug('SEARCH', 'ChromaDB returned semantic matches', { matchCount: chromaResults.ids.length });
|
logger.debug('SEARCH', 'ChromaDB returned semantic matches', { matchCount: chromaResults.ids.length });
|
||||||
|
|
||||||
if (chromaResults.ids.length > 0) {
|
if (chromaResults.ids.length > 0) {
|
||||||
// Step 2: Filter by recency (90 days)
|
// Step 2: Filter by date range
|
||||||
const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS;
|
// Use user-provided dateRange if available, otherwise fall back to 90-day recency window
|
||||||
|
const { dateRange } = options;
|
||||||
|
let startEpoch: number | undefined;
|
||||||
|
let endEpoch: number | undefined;
|
||||||
|
|
||||||
|
if (dateRange) {
|
||||||
|
if (dateRange.start) {
|
||||||
|
startEpoch = typeof dateRange.start === 'number'
|
||||||
|
? dateRange.start
|
||||||
|
: new Date(dateRange.start).getTime();
|
||||||
|
}
|
||||||
|
if (dateRange.end) {
|
||||||
|
endEpoch = typeof dateRange.end === 'number'
|
||||||
|
? dateRange.end
|
||||||
|
: new Date(dateRange.end).getTime();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Default: 90-day recency window
|
||||||
|
startEpoch = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS;
|
||||||
|
}
|
||||||
|
|
||||||
const recentMetadata = chromaResults.metadatas.map((meta, idx) => ({
|
const recentMetadata = chromaResults.metadatas.map((meta, idx) => ({
|
||||||
id: chromaResults.ids[idx],
|
id: chromaResults.ids[idx],
|
||||||
meta,
|
meta,
|
||||||
isRecent: meta && meta.created_at_epoch > ninetyDaysAgo
|
isRecent: meta && meta.created_at_epoch != null
|
||||||
|
&& (!startEpoch || meta.created_at_epoch >= startEpoch)
|
||||||
|
&& (!endEpoch || meta.created_at_epoch <= endEpoch)
|
||||||
})).filter(item => item.isRecent);
|
})).filter(item => item.isRecent);
|
||||||
|
|
||||||
logger.debug('SEARCH', 'Results within 90-day window', { count: recentMetadata.length });
|
logger.debug('SEARCH', dateRange ? 'Results within user date range' : 'Results within 90-day window', { count: recentMetadata.length });
|
||||||
|
|
||||||
// Step 3: Categorize IDs by document type
|
// Step 3: Categorize IDs by document type
|
||||||
const obsIds: number[] = [];
|
const obsIds: number[] = [];
|
||||||
|
|||||||
Reference in New Issue
Block a user