Use a new scorer to improve search results.

This makes the other pages take less priority than the API results.
It's kind of biased, but hopefully it helps out.
This commit is contained in:
Rapptz 2019-06-29 02:36:26 -04:00
parent c26797d808
commit d747f2c88b
2 changed files with 79 additions and 1 deletions

78
docs/_static/scorer.js vendored Normal file
View File

@ -0,0 +1,78 @@
var _queryBeingDone = null;
var _pattern = null;
var _escapedRegex = /[-\/\\^$*+?.()|[\]{}]/g;
function escapeRegex(e) {
return e.replace(_escapedRegex, '\\$&');
}
// for some reason Sphinx shows some entries twice
// if something has been scored already I'd rather sort it to the bottom
var _beenScored = new Set();
function __score(haystack, regex) {
let match = regex.exec(haystack);
if(match == null) {
return Number.MAX_VALUE;
}
let subLength = match[0].length;
let start = match.index;
return (subLength * 1000 + start) / 1000.0;
}
// unused for now
function __cleanNamespaces(query) {
return query.replace(/(discord\.(ext\.)?)?(.+)/, '$3');
}
var Scorer = {
// Implement the following function to further tweak the score for each result
// The function takes a result array [filename, title, anchor, descr, score]
// and returns the new score.
score: function(result) {
// only inflate the score of things that are actual API reference things
if(_pattern !== null && result[1].startsWith('discord.')) {
let _score = __score(result[1], _pattern);
if(_score === Number.MAX_VALUE) {
return result[4];
}
if(_beenScored.has(result[1])) {
return 0;
}
_beenScored.add(result[1]);
let newScore = 100 + _queryBeingDone.length - _score;
// console.log(`${result[1]}: ${result[4]} -> ${newScore} (${_score})`);
return newScore;
}
return result[4];
},
// query matches the full name of an object
objNameMatch: 15,
// or matches in the last dotted part of the object name
objPartialMatch: 11,
// Additive scores depending on the priority of the object
objPrio: {0: 15, // used to be importantResults
1: 7, // used to be objectResults
2: -5}, // used to be unimportantResults
// Used when the priority is not in the mapping.
objPrioDefault: 0,
// query found in title
title: 15,
partialTitle: 7,
// query found in terms
term: 5,
partialTerm: 2
};
$(document).ready(function() {
let params = $.getQueryParameters();
if(params.q) {
_queryBeingDone = params.q[0];
let pattern = Array.from(_queryBeingDone).map(escapeRegex).join('.*?');
_pattern = new RegExp(pattern, 'i');
}
});

View File

@ -234,7 +234,7 @@ html_static_path = ['_static']
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
html_search_scorer = '_static/scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'discord.pydoc'