Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit f27d6f6

Browse files
Update keyword search to be a substring search instead of exact match. Also search on first name, last name and handle. Support special characters
1 parent aa9150a commit f27d6f6

File tree

1 file changed

+52
-16
lines changed

1 file changed

+52
-16
lines changed

src/common/es-helper.js

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -597,11 +597,14 @@ function setUserAttributesFiltersToEsQuery (filterClause, attributes) {
597597
}
598598
}
599599
],
600-
should: attribute.value.map(val => ({
601-
term: {
602-
[USER_ATTRIBUTE.esDocumentValueQuery]: val
600+
should: attribute.value.map(val => {
601+
return {
602+
query_string: {
603+
default_field: `${[USER_ATTRIBUTE.esDocumentValueStringQuery]}`,
604+
query: `*${val.replace(/ +/g, ' ').split(' ').join('* AND *')}*`
605+
}
603606
}
604-
})),
607+
}),
605608
minimum_should_match: 1
606609
}
607610
}
@@ -610,6 +613,11 @@ function setUserAttributesFiltersToEsQuery (filterClause, attributes) {
610613
}
611614
}
612615

616+
function hasNonAlphaNumeric(text) {
617+
const regex = /^[A-Za-z0-9 ]+$/
618+
return !regex.test(text)
619+
}
620+
613621
/**
614622
* Get skillIds matching the search keyword
615623
*
@@ -618,14 +626,18 @@ function setUserAttributesFiltersToEsQuery (filterClause, attributes) {
618626
*/
619627
async function searchSkills (keyword) {
620628
const queryDoc = DOCUMENTS.skill
629+
630+
let query = hasNonAlphaNumeric(keyword) ? `\\*${keyword}\\*` : `*${keyword}*`
631+
621632
const esQuery = {
622633
index: queryDoc.index,
623634
type: queryDoc.type,
624635
body: {
625636
query: {
626637
query_string: {
627638
default_field: 'name',
628-
query: `*${keyword}*`
639+
minimum_should_match: '100%',
640+
query
629641
}
630642
},
631643
_source: 'id'
@@ -640,19 +652,26 @@ async function searchSkills (keyword) {
640652
async function setUserSearchClausesToEsQuery (boolClause, keyword) {
641653
const skillIds = await searchSkills(keyword)
642654

655+
boolClause.should.push({
656+
query_string: {
657+
fields: ['firstName', 'lastName', 'handle'],
658+
query: `*${keyword.replace(/ +/g, ' ').split(' ').join('* AND *')}*`
659+
}
660+
})
661+
643662
boolClause.should.push({
644663
nested: {
645664
path: USER_ATTRIBUTE.esDocumentPath,
646665
query: {
647666
query_string: {
648-
query: `*${keyword}*`,
667+
query: hasNonAlphaNumeric(keyword) ? `\\*${keyword}\\*` : `*${keyword}*`,
649668
fields: [USER_ATTRIBUTE.esDocumentValueStringQuery]
650669
}
651670
}
652671
}
653672
}, {
654673
query_string: {
655-
query: `*${keyword}*`,
674+
query: hasNonAlphaNumeric(keyword) ? `\\*${keyword}\\*` : `*${keyword}*`,
656675
fields: [USER_FILTER_TO_MODEL.achievement.esDocumentValueQuery]
657676
}
658677
})
@@ -783,21 +802,27 @@ async function resolveUserFilterFromDb (filter, { handle }, organizationId) {
783802
}
784803
})
785804

786-
if (typeof filter.values === 'object') {
787-
for (const value of filter.values) {
805+
if (typeof filter.values !== 'object') {
806+
filter.values = [filter.values]
807+
}
808+
809+
for (const value of filter.values) {
810+
if (value === 'true' || value === 'false') {
788811
esQueryClause.bool.should.push({
789812
term: {
790813
[filter.esDocumentValueQuery]: value
791814
}
792815
})
816+
} else {
817+
esQueryClause.bool.should.push({
818+
query_string: {
819+
default_field: `${filter.esDocumentValueQuery}`,
820+
query: `*${value.replace(/ +/g, ' ').split(' ').join('* AND *')}*`
821+
}
822+
})
793823
}
794-
} else {
795-
esQueryClause.bool.should.push({
796-
term: {
797-
[filter.esDocumentValueQuery]: filter.values
798-
}
799-
})
800824
}
825+
801826
esQueryClause.bool.minimum_should_match = 1
802827

803828
return {
@@ -815,10 +840,18 @@ async function resolveUserFilterFromDb (filter, { handle }, organizationId) {
815840
}
816841

817842
const model = filter.model
843+
844+
let filterValuesQuery = `${filter.queryField} like '%${filter.values[0]}%'`
845+
const nFilterValues = filter.values.length
846+
for (let i = 1; i < nFilterValues; i++) {
847+
filterValuesQuery = `${filterValuesQuery} OR ${filter.queryField} like '%${filter.values[i]}%'`
848+
}
849+
818850
// TODO Use the service method instead of raw query
819851
const dbQueries = [
820-
`${filter.queryField} in (${filter.values.map(f => `'${f}'`).join(',')})`
852+
filterValuesQuery
821853
]
854+
822855
const results = await DBHelper.find(model, dbQueries)
823856
if (results.length > 0) {
824857
for (const { id } of results) {
@@ -1275,6 +1308,9 @@ async function searchUsers (authUser, filter, params) {
12751308

12761309
const docs = await esClient.search(esQuery)
12771310
const users = docs.hits.hits.map(hit => hit._source)
1311+
1312+
logger.debug('Enrich users')
1313+
12781314
const result = await enrichUsers(users)
12791315
// enrich groups
12801316
for (const user of users) {

0 commit comments

Comments
 (0)