Commit dd6e1776 authored by LongLD's avatar LongLD

feat: ensure global rules always appear in search results regardless of minScore or tag filters

parent ee42a81a
...@@ -33,16 +33,40 @@ export class RuleIndexer { ...@@ -33,16 +33,40 @@ export class RuleIndexer {
search(query, options = {}) { search(query, options = {}) {
const { openFiles = [], changedFiles = [], tags = [], limit = 6, minScore = 0.15 } = options; const { openFiles = [], changedFiles = [], tags = [], limit = 6, minScore = 0.15 } = options;
const results = this.cachedRules.map(rule => this.scorer.scoreRule(rule, query, openFiles, changedFiles, tags)); const results = this.cachedRules.map(rule => this.scorer.scoreRule(rule, query, openFiles, changedFiles, tags));
// Sort by score desc // Separate global rules from others
const sorted = results const globalResults = [];
.filter(r => r.score >= minScore) const regularResults = [];
.sort((a, b) => b.score - a.score); results.forEach(r => {
const isGlobalRule = r.rule.tags.includes('global') ||
r.rule.tags.includes('base') ||
r.rule.id.includes('base') ||
r.rule.relativePath === 'base.md';
if (isGlobalRule) {
globalResults.push(r);
}
else if (r.score >= minScore) {
regularResults.push(r);
}
});
// Sort both groups by score desc
globalResults.sort((a, b) => b.score - a.score);
regularResults.sort((a, b) => b.score - a.score);
// Diversification and Deduplication logic // Diversification and Deduplication logic
const diversified = []; const diversified = [];
const categoryCounts = {}; const categoryCounts = {};
const seenIds = new Set(); const seenIds = new Set();
for (const res of sorted) { // Always include global rules first (with reduced limit if needed)
// Deduplicate by ID for (const res of globalResults) {
if (seenIds.has(res.rule.id))
continue;
diversified.push(res);
seenIds.add(res.rule.id);
// Don't count global rules against category limits
if (diversified.length >= limit)
break;
}
// Then add regular rules with diversification
for (const res of regularResults) {
if (seenIds.has(res.rule.id)) if (seenIds.has(res.rule.id))
continue; continue;
// Determine category from relative path (first dir) // Determine category from relative path (first dir)
......
...@@ -54,18 +54,45 @@ export class RuleIndexer { ...@@ -54,18 +54,45 @@ export class RuleIndexer {
this.scorer.scoreRule(rule, query, openFiles, changedFiles, tags) this.scorer.scoreRule(rule, query, openFiles, changedFiles, tags)
); );
// Sort by score desc // Separate global rules from others
const sorted = results const globalResults: SearchResult[] = [];
.filter(r => r.score >= minScore) const regularResults: SearchResult[] = [];
.sort((a, b) => b.score - a.score);
results.forEach(r => {
const isGlobalRule = r.rule.tags.includes('global') ||
r.rule.tags.includes('base') ||
r.rule.id.includes('base') ||
r.rule.relativePath === 'base.md';
if (isGlobalRule) {
globalResults.push(r);
} else if (r.score >= minScore) {
regularResults.push(r);
}
});
// Sort both groups by score desc
globalResults.sort((a, b) => b.score - a.score);
regularResults.sort((a, b) => b.score - a.score);
// Diversification and Deduplication logic // Diversification and Deduplication logic
const diversified: SearchResult[] = []; const diversified: SearchResult[] = [];
const categoryCounts: { [cat: string]: number } = {}; const categoryCounts: { [cat: string]: number } = {};
const seenIds = new Set<string>(); const seenIds = new Set<string>();
for (const res of sorted) { // Always include global rules first (with reduced limit if needed)
// Deduplicate by ID for (const res of globalResults) {
if (seenIds.has(res.rule.id)) continue;
diversified.push(res);
seenIds.add(res.rule.id);
// Don't count global rules against category limits
if (diversified.length >= limit) break;
}
// Then add regular rules with diversification
for (const res of regularResults) {
if (seenIds.has(res.rule.id)) continue; if (seenIds.has(res.rule.id)) continue;
// Determine category from relative path (first dir) // Determine category from relative path (first dir)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment