@@ -447,11 +447,11 @@ public PageSearchResult searchPages(@NonNull SearchQuery searchQuery) {
447447 return searchResult ;
448448 }
449449
450- private CompleteSearch extractCompleteSearch (String keyword ) {
450+ CompleteSearch extractCompleteSearch (String keyword ) {
451451 CompleteSearch completeSearch = new CompleteSearch ();
452452 completeSearch .setAdvancedSearches (new ArrayList <>());
453453 completeSearch .setCollectionIds (new ArrayList <>());
454- String [] keywords = keyword . split ( " " );
454+ List < String > keywords = splitSearchTokens ( keyword );
455455 List <String > simpleWords = new ArrayList <>();
456456 for (String key : keywords ) {
457457 if (StringUtils .isBlank (key )) {
@@ -482,14 +482,70 @@ private CompleteSearch extractCompleteSearch(String keyword) {
482482 private AdvancedSearch extractAdvancedSearch (String key , String docField , String seperator ) {
483483 AdvancedSearch advancedSearch = new AdvancedSearch ();
484484 advancedSearch .setDocField (docField );
485- String [] parts = key .split (seperator );
486- if (parts .length == 2 ) {
487- advancedSearch .setKeyword (parts [1 ]);
488- }
485+ advancedSearch .setKeyword (extractAdvancedSearchKeyword (key , seperator ));
489486 advancedSearch .words = segmentWords (advancedSearch .getKeyword (), true );
490487 return advancedSearch ;
491488 }
492489
490+ static String extractAdvancedSearchKeyword (String key , String separator ) {
491+ int separatorIndex = key .indexOf (separator );
492+ if (separatorIndex < 0 ) {
493+ return "" ;
494+ }
495+ return key .substring (separatorIndex + separator .length ()).trim ();
496+ }
497+
498+ static List <String > splitSearchTokens (String keyword ) {
499+ List <String > tokens = new ArrayList <>();
500+ if (StringUtils .isBlank (keyword )) {
501+ return tokens ;
502+ }
503+
504+ StringBuilder token = new StringBuilder ();
505+ boolean inQuotes = false ;
506+ boolean escaping = false ;
507+
508+ for (int i = 0 ; i < keyword .length (); i ++) {
509+ char current = keyword .charAt (i );
510+
511+ if (escaping ) {
512+ token .append (current );
513+ escaping = false ;
514+ continue ;
515+ }
516+
517+ if (inQuotes && current == '\\' ) {
518+ escaping = true ;
519+ continue ;
520+ }
521+
522+ if (current == '"' ) {
523+ inQuotes = !inQuotes ;
524+ continue ;
525+ }
526+
527+ if (!inQuotes && Character .isWhitespace (current )) {
528+ if (token .length () > 0 ) {
529+ tokens .add (token .toString ());
530+ token .setLength (0 );
531+ }
532+ continue ;
533+ }
534+
535+ token .append (current );
536+ }
537+
538+ if (escaping ) {
539+ token .append ('\\' );
540+ }
541+
542+ if (token .length () > 0 ) {
543+ tokens .add (token .toString ());
544+ }
545+
546+ return tokens ;
547+ }
548+
493549 private SearchOption parseSearchOption (String options ) {
494550 SearchOption option = new SearchOption ();
495551 if (StringUtils .isNotBlank (options )) {
@@ -542,6 +598,9 @@ private SearchOption parseSearchOption(String options) {
542598
543599 private List <String > segmentWords (String keyword , boolean useSmart ) {
544600 List <String > words = new ArrayList <>();
601+ if (StringUtils .isBlank (keyword )) {
602+ return words ;
603+ }
545604 StringReader sr = new StringReader (keyword );
546605 IKSegmenter segmenter = new IKSegmenter (sr , useSmart );
547606 Lexeme lexeme = null ;
0 commit comments