Skip to content

Commit 7c3f359

Browse files
authored
fuzzy scorer - reduce boost from long consecutive matches (microsoft#252118)
1 parent b5ad5e3 commit 7c3f359

File tree

2 files changed

+37
-20
lines changed

2 files changed

+37
-20
lines changed

src/vs/base/common/fuzzyScorer.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,11 @@ function computeCharScore(queryCharAtIndex: string, queryLowerCharAtIndex: strin
173173
// console.log(`%cCharacter match bonus: +1`, 'font-weight: normal');
174174
// }
175175

176-
// Consecutive match bonus
176+
// Consecutive match bonus: sequences up to 3 get the full bonus (6)
177+
// and the remainder gets half the bonus (3). This helps reduce the
178+
// overall boost for long sequence matches.
177179
if (matchesSequenceLength > 0) {
178-
score += (matchesSequenceLength * 5);
180+
score += (Math.min(matchesSequenceLength, 3) * 6) + (Math.max(0, matchesSequenceLength - 3) * 3);
179181

180182
// if (DEBUG) {
181183
// console.log(`Consecutive match bonus: +${matchesSequenceLength * 5}`);

src/vs/base/test/common/fuzzyScorer.test.ts

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,30 +1085,45 @@ suite('Fuzzy Scorer', () => {
10851085
const resourceA = URI.file('djangosite/ufrela/def.py');
10861086
const resourceB = URI.file('djangosite/urls/default.py');
10871087

1088-
for (const query of ['url/def']) {
1089-
let res = [resourceA, resourceB].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor));
1090-
assert.strictEqual(res[0], resourceB);
1091-
assert.strictEqual(res[1], resourceA);
1088+
const query = 'url/def';
10921089

1093-
res = [resourceB, resourceA].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor));
1094-
assert.strictEqual(res[0], resourceB);
1095-
assert.strictEqual(res[1], resourceA);
1096-
}
1090+
let res = [resourceA, resourceB].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor));
1091+
assert.strictEqual(res[0], resourceB);
1092+
assert.strictEqual(res[1], resourceA);
1093+
1094+
res = [resourceB, resourceA].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor));
1095+
assert.strictEqual(res[0], resourceB);
1096+
assert.strictEqual(res[1], resourceA);
10971097
});
10981098

10991099
test('compareFilesByScore - boost shorter prefix match if multiple queries are used (#99171)', function () {
11001100
const resourceA = URI.file('mesh_editor_lifetime_job.h');
11011101
const resourceB = URI.file('lifetime_job.h');
11021102

1103-
for (const query of ['m life, life m']) {
1104-
let res = [resourceA, resourceB].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor));
1105-
assert.strictEqual(res[0], resourceB);
1106-
assert.strictEqual(res[1], resourceA);
1103+
const query = 'm life, life m';
11071104

1108-
res = [resourceB, resourceA].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor));
1109-
assert.strictEqual(res[0], resourceB);
1110-
assert.strictEqual(res[1], resourceA);
1111-
}
1105+
let res = [resourceA, resourceB].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor));
1106+
assert.strictEqual(res[0], resourceB);
1107+
assert.strictEqual(res[1], resourceA);
1108+
1109+
res = [resourceB, resourceA].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor));
1110+
assert.strictEqual(res[0], resourceB);
1111+
assert.strictEqual(res[1], resourceA);
1112+
});
1113+
1114+
test('compareFilesByScore - boost consecutive matches in the beginning over end', function () {
1115+
const resourceA = URI.file('src/vs/server/node/extensionHostStatusService.ts');
1116+
const resourceB = URI.file('src/vs/workbench/browser/parts/notifications/notificationsStatus.ts');
1117+
1118+
const query = 'notStatus';
1119+
1120+
let res = [resourceA, resourceB].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor));
1121+
assert.strictEqual(res[0], resourceB);
1122+
assert.strictEqual(res[1], resourceA);
1123+
1124+
res = [resourceB, resourceA].sort((r1, r2) => compareItemsByScore(r1, r2, query, true, ResourceAccessor));
1125+
assert.strictEqual(res[0], resourceB);
1126+
assert.strictEqual(res[1], resourceA);
11121127
});
11131128

11141129
test('prepareQuery', () => {
@@ -1255,12 +1270,12 @@ suite('Fuzzy Scorer', () => {
12551270
assert.strictEqual(_doScore('contiguous', '"contguous"')[0], 0);
12561271

12571272
const score = _doScore('contiguous', '"contiguous"');
1258-
assert.strictEqual(score[0], 253);
1273+
assert.ok(score[0] > 0);
12591274
});
12601275

12611276
test('Using quotes should highlight contiguous indexes', function () {
12621277
const score = _doScore('2021-7-26.md', '"26"');
1263-
assert.strictEqual(score[0], 13);
1278+
assert.strictEqual(score[0], 14);
12641279

12651280
// The indexes of the 2 and 6 of "26"
12661281
assert.strictEqual(score[1][0], 7);

0 commit comments

Comments
 (0)