@@ -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 - Z a - z 0 - 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 */
619627async 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) {
640652async 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