strapi-plugin-fuzzy-search-young
Version:
Register a weighted fuzzy search endpoint for Strapi Headless CMS you can add your content types to in no time.
48 lines (47 loc) • 2.11 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fuzzysort_1 = __importDefault(require("fuzzysort"));
const transliteration_1 = require("transliteration");
exports.default = ({ model, keys, query, result, }) => {
const { pluralName } = model.schemaInfo;
/**
* Transliterate relevant fields for the entry
*/
model[pluralName].forEach((entry) => {
const entryKeys = Object.keys(entry);
entry.transliterations = {};
entryKeys.forEach((key) => {
if (!keys.includes(key) || !entry[key])
return;
entry.transliterations[key] = (0, transliteration_1.transliterate)(entry[key]);
});
});
const transliterationKeys = keys.map((key) => `transliterations.${key}`);
const { uid, schemaInfo, fuzzysortOptions } = model;
const transliteratedResult = {
uid,
schemaInfo,
fuzzysortResults: fuzzysort_1.default.go(query, model[pluralName], {
threshold: fuzzysortOptions.threshold,
limit: fuzzysortOptions.limit,
keys: transliterationKeys,
scoreFn: (a) => Math.max(...fuzzysortOptions.keys.map((key, index) => a[index] ? a[index].score + key.weight : -9999)),
}),
};
const previousResults = result.fuzzysortResults;
if (!previousResults.total)
return transliteratedResult;
const newResults = [...previousResults];
// In the chance that a transliterated result scores higher than its non-transliterated counterpart,
// overwrite the original result with the transliterated result and resort the results
transliteratedResult.fuzzysortResults.forEach((res) => {
const origIndex = previousResults.findIndex((origRes) => origRes.obj.id === res.obj.id && origRes.score <= res.score);
if (origIndex >= 0)
newResults[origIndex] = res;
});
newResults.sort((a, b) => b.score - a.score);
return result;
};