vietnamese-text-search
Version:
Text search for vietnamese.
18 lines • 3.25 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _utils=require("./utils"),_config=_interopRequireDefault(require("./config"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var _default={/**
* @param {ScoreObject[]} scoreObjs
* @returns {ScoreObject} { textKey1: score1, textKey2: score2, ... }
*/mergeScoreObjs(scoreObjs){return scoreObjs.reduce((finalObj,curObj)=>{for(const[key,val]of Object.entries(curObj))finalObj[key]?finalObj[key]+=val:finalObj[key]=val;return finalObj},{})},/**
* @param {TextIndex} textIndex
* @param {Keyword} keyword
* @returns {Text4lsObject} { l0: Set(ids), l1: Set(ids), l2: Set(ids), l3: Set(ids) }
*/getAll4LsTextIds(textIndex,keyword){const firstKeywordChars=(0,_utils.getLigatures)(keyword),pureKeyword=(0,_utils.removeAccents)(keyword),pureFirstKeywordChars=(0,_utils.removeAccents)(firstKeywordChars),{l0=[],l1=[],l2=[],l3=[]}={};if(textIndex[pureFirstKeywordChars]){const textIndexL0=textIndex[pureFirstKeywordChars];if((0,_utils.getNestedObjValues)(textIndexL0,l0),textIndexL0[firstKeywordChars]){const textIndexL1=textIndexL0[firstKeywordChars];if((0,_utils.getNestedObjValues)(textIndexL1,l1),textIndexL1[pureKeyword]){const textIndexL2=textIndexL1[pureKeyword];if((0,_utils.getNestedObjValues)(textIndexL2,l2),textIndexL2[keyword]){const textIndexL3=textIndexL2[keyword];(0,_utils.getNestedObjValues)(textIndexL3,l3)}}}}const resultObj={l0:new Set(l0),l1:new Set(l1),l2:new Set(l2),l3:new Set(l3)};return resultObj},/**
* @param {TextIndex} textIndex
* @param {Keyword} keyword
* @param {GetTextScoreOptions} options
* @returns {ScoreObject} { textKey1: score1, textKey2: score2, ... }
*/async getTextScoresWithKeyword(textBucket,keyword,options={}){const{buckets=Object.keys(textBucket),useAddedScore=!1,keysLength=1}=options,scoreObjs=await Promise.all(buckets.map(bucket=>{const textIndex=textBucket[bucket].textIndex,{l0,l1,l2,l3}=this.getAll4LsTextIds(textIndex,keyword),allTextIds=new Set([...l0,...l1,...l2,...l3]),topTextObjs=[...allTextIds].reduce((acc,cur)=>{let score=0;const coeff01=(0,_utils.getLigatures)(keyword).length;l0.has(cur)&&(score+=_config.default.ScoreL0*coeff01),l1.has(cur)&&(score+=_config.default.ScoreL1*coeff01),l2.has(cur)&&(score+=_config.default.ScoreL2),l3.has(cur)&&(score+=_config.default.ScoreL3);const textObj=textBucket[bucket].textDict[cur];return textObj&&(acc[cur]=score+ +useAddedScore*textObj.addedScore/keysLength),acc},{});return topTextObjs}));return this.mergeScoreObjs(scoreObjs)},/**
* @param {TextBucket} textBucket
* @param {Keyword[]} keywords
* @param {GetTextScoreOptions} options
* @returns {Promise<ScoreEntry[]>} [ [textKey1, score1], [textKey2, score2], ... ]
*/async getTextScoresWithManyKeywords(textBucket,keywords,options={}){const{buckets=Object.keys(textBucket),useAddedScore=!1}=options;if(!buckets.length)return[];const textScoreObjs=await Promise.all(keywords.map(keyword=>this.getTextScoresWithKeyword(textBucket,keyword,{buckets,useAddedScore,keysLength:keywords.length}))),mergedTextScoresObj=this.mergeScoreObjs(textScoreObjs);return Object.entries(mergedTextScoresObj)}};exports.default=_default;