3
3
import java .io .IOException ;
4
4
import java .util .*;
5
5
6
- import fr .techad .edc .httpd .utils .LangUtils ;
6
+ import fr .techad .edc .httpd .utils .CaseSensitiveStandardAnalyzer ;
7
7
import org .apache .commons .lang3 .StringUtils ;
8
8
import org .apache .lucene .analysis .standard .StandardAnalyzer ;
9
9
import org .apache .lucene .document .Document ;
12
12
import org .apache .lucene .queryparser .classic .MultiFieldQueryParser ;
13
13
import org .apache .lucene .queryparser .classic .ParseException ;
14
14
import org .apache .lucene .queryparser .classic .QueryParser ;
15
- import org .apache .lucene .queryparser .classic .QueryParserBase ;
16
15
import org .apache .lucene .search .IndexSearcher ;
17
16
import org .apache .lucene .search .Query ;
18
17
import org .apache .lucene .search .ScoreDoc ;
29
28
*/
30
29
public class ContentSearcher extends ContentBase {
31
30
private static final Logger LOGGER = LoggerFactory .getLogger (ContentSearcher .class );
32
- private static final String [] SEARCH_FIELDS = { DOC_LABEL , DOC_CONTENT , DOC_TYPE };
33
- private static final Map <String , Float > BOOTS ;
31
+ private final static String [] SEARCH_FIELD_NORMAL_CASE = { DOC_LABEL , DOC_CONTENT_NORMAL_CASE , DOC_TYPE };
32
+ private final static String [] SEARCH_FIELD_LOWER_CASE = { DOC_LABEL , DOC_CONTENT_LOWER_CASE , DOC_TYPE };
33
+ private static final Map <String , Float > BOOTS_NORMAL_CASE ;
34
+ private static final Map <String , Float > BOOTS_LOWER_CASE ;
34
35
static {
35
- Map <String , Float > aMap = new HashMap <>();
36
- aMap .put (DOC_LABEL , 2f );
37
- aMap .put (DOC_CONTENT , 1f );
38
- aMap .put (DOC_TYPE , .5f );
39
- BOOTS = Collections .unmodifiableMap (aMap );
36
+ Map <String , Float > normalCaseMap = new HashMap <>();
37
+ Map <String , Float > lowerCaseMap = new HashMap <>();
38
+ normalCaseMap .put (DOC_LABEL , 2f );
39
+ normalCaseMap .put (DOC_CONTENT_NORMAL_CASE , 1f );
40
+ normalCaseMap .put (DOC_TYPE , .5f );
41
+ lowerCaseMap .put (DOC_LABEL , 2f );
42
+ lowerCaseMap .put (DOC_CONTENT_LOWER_CASE , 1f );
43
+ lowerCaseMap .put (DOC_TYPE , .5f );
44
+ BOOTS_NORMAL_CASE = Collections .unmodifiableMap (normalCaseMap );
45
+ BOOTS_LOWER_CASE = Collections .unmodifiableMap (lowerCaseMap );
40
46
}
41
47
42
48
private IndexSearcher indexSearcher ;
49
+ private QueryParser qp ;
43
50
44
51
public ContentSearcher (WebServerConfig webServerConfig ) {
45
52
super (webServerConfig );
@@ -54,7 +61,7 @@ public ContentSearcher(WebServerConfig webServerConfig) {
54
61
* @throws ParseException if the search parameter is malformed
55
62
*/
56
63
public List <DocumentationSearchResult > search (String search , String lang , int limit , boolean exact ,
57
- String defaultLanguage , Set <String > languages ) throws IOException , ParseException {
64
+ boolean matchCase , String defaultLanguage , Set <String > languages ) throws IOException , ParseException {
58
65
// Handle wildcard with exacttMode condition
59
66
if (!exact && !search .endsWith ("*" )) {
60
67
search = search + "*" ;
@@ -63,13 +70,21 @@ public List<DocumentationSearchResult> search(String search, String lang, int li
63
70
List <DocumentationSearchResult > results = new ArrayList <>();
64
71
LOGGER .debug ("Search {}" , search );
65
72
createSearcher ();
66
- QueryParser qp = new MultiFieldQueryParser (SEARCH_FIELDS , new StandardAnalyzer (), BOOTS );
73
+
74
+ if (matchCase ){
75
+ qp = new MultiFieldQueryParser (SEARCH_FIELD_NORMAL_CASE , new CaseSensitiveStandardAnalyzer (), BOOTS_NORMAL_CASE );
76
+ } else {
77
+ qp = new MultiFieldQueryParser (SEARCH_FIELD_LOWER_CASE , new StandardAnalyzer (), BOOTS_LOWER_CASE );
78
+ }
79
+
67
80
qp .setAllowLeadingWildcard (true );
81
+ qp .setDefaultOperator (QueryParser .Operator .AND );
82
+
68
83
String langSearch = "" ;
69
84
if (StringUtils .isNotBlank (lang )) {
70
85
langSearch = " AND languageCode:" + lang ;
71
86
}
72
- Query query = qp .parse (QueryParserBase . escape ( search ) + langSearch );
87
+ Query query = qp .parse (search + langSearch );
73
88
TopDocs hits = indexSearcher .search (query , limit );
74
89
LOGGER .debug ("Found {} results for the search '{}'" , hits .totalHits , search );
75
90
@@ -88,7 +103,7 @@ public List<DocumentationSearchResult> search(String search, String lang, int li
88
103
89
104
}
90
105
if (results .isEmpty () && !defaultLanguage .equals (lang ) && !languages .contains (lang )) {
91
- return search (search , defaultLanguage , limit , exact , defaultLanguage , languages );
106
+ return search (search , defaultLanguage , limit , exact , matchCase , defaultLanguage , languages );
92
107
}
93
108
return results ;
94
109
}
0 commit comments