Skip to content

Commit

Permalink
Merge pull request #140 from topcoder-platform/feature/emsi_skills_se…
Browse files Browse the repository at this point in the history
…arch

Search tweaks
  • Loading branch information
jmgasper committed Aug 16, 2023
2 parents 37a8175 + e4d6fd0 commit 1d577b1
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 7 deletions.
15 changes: 14 additions & 1 deletion src/common/eshelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -287,8 +287,20 @@ async function searchMembersSkills (skillIds, skillsBooleanOperator, page, perPa
type: config.get('ES.MEMBER_PROFILE_ES_TYPE'),
size: 10000,
scroll: '90s',
_source:[
'userId',
'emsiSkills.skillId',
'emsiSkills.skillSources',
'emsiSkills.name',
'handle',
'handleLower',
'photoURL',
'firstName',
'lastName',
'homeCountryCode',
'addresses'
],
body: {
sort: [{ createdAt: { order: 'desc' } }],
query: {
bool: {
filter: { bool: {} }
Expand Down Expand Up @@ -330,6 +342,7 @@ async function searchMembersSkills (skillIds, skillsBooleanOperator, page, perPa
const response = await esClient.search(esQuerySkills)

responseQueue.push(response)

while (responseQueue.length) {
const body = responseQueue.shift()
// collect the titles from this response
Expand Down
39 changes: 33 additions & 6 deletions src/services/SearchService.js
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,27 @@ async function addVerifiedFlag(results){
return results
}

async function fillMembers(docsMembers, query, fields) {
// The default search order, used by general handle searches
function handleSearchOrder(results, query){
// Sort the results for default searching
results = _.orderBy(results, [query.sortBy, "handleLower"], [query.sortOrder])
return results
}

// The skill search order, which has a secondary sort of the number of
// Topcoder-verified skills, in descending order (where skillSource = ChallengeWin)
function skillSearchOrder(results, query){
results = _.orderBy(results, [query.sortBy, function (member) {
challengeWinSkills = _.filter(member.emsiSkills,
function(skill) {
return _.includes(skill.skillSources, 'ChallengeWin')
})
return challengeWinSkills.length
}], [query.sortOrder, 'desc'])
return results
}

async function fillMembers(docsMembers, query, fields, skillSearch=false) {
// get the total
const total = eshelper.getTotal(docsMembers)

Expand All @@ -218,8 +238,14 @@ async function fillMembers(docsMembers, query, fields) {
// filter member based on fields
results = _.map(results, (item) => _.pick(item, fields))

// Sort the results
results = _.orderBy(results, [query.sortBy, "handleLower"], [query.sortOrder])
// Sort in slightly different secondary orders, depending on if
// this is a skill search or handle search
if(skillSearch){
results = skillSearchOrder(results, query)
}
else{
results = handleSearchOrder(results, query)
}

results = helper.paginate(results, query.perPage, query.page - 1)
// filter member based on fields
Expand All @@ -232,7 +258,6 @@ async function fillMembers(docsMembers, query, fields) {
results = await addVerifiedFlag(results)
}


return { total: total, page: query.page, perPage: query.perPage, result: results }
}

Expand Down Expand Up @@ -300,8 +325,10 @@ const searchMembersBySkillsWithOptions = async (currentUser, query, skillsFilter
}

const membersSkillsDocs = await eshelper.searchMembersSkills(skillsFilter, skillsBooleanOperator, page, perPage, esClient)
let response = await fillMembers(membersSkillsDocs, query, fields)
response.result = _.orderBy(response.result, sortBy, sortOrder)

// We pass in "true" so that fillMembers knows we're doing a skill sort so the secondary
// sort order (after skillScore) is the number of verified skills in descending order
let response = await fillMembers(membersSkillsDocs, query, fields, true)

// secure address data
const canManageMember = currentUser && (currentUser.isMachine || helper.hasAdminRole(currentUser))
Expand Down

0 comments on commit 1d577b1

Please sign in to comment.