1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package fr.paris.lutece.plugins.mylutece.modules.users.service.search;
35
36 import fr.paris.lutece.portal.service.search.IndexationService;
37 import fr.paris.lutece.portal.service.search.LuceneSearchEngine;
38 import fr.paris.lutece.portal.service.search.SearchItem;
39 import fr.paris.lutece.portal.service.util.AppLogService;
40 import java.util.ArrayList;
41 import java.util.HashMap;
42 import java.util.List;
43 import java.util.Map;
44
45 import javax.servlet.http.HttpServletRequest;
46 import org.apache.lucene.document.Document;
47 import org.apache.lucene.index.DirectoryReader;
48 import org.apache.lucene.index.IndexReader;
49 import org.apache.lucene.index.IndexableField;
50 import org.apache.lucene.queryparser.classic.QueryParser;
51 import org.apache.lucene.search.BooleanClause;
52 import org.apache.lucene.search.BooleanQuery;
53 import org.apache.lucene.search.IndexSearcher;
54 import org.apache.lucene.search.ScoreDoc;
55 import org.apache.lucene.search.TopDocs;
56 import org.apache.lucene.store.Directory;
57
58
59
60
61
62
63 public class LocalUserSearchEngine
64 {
65
66
67
68
69
70
71
72
73
74 public static List<Map<String, String>> getSearchResults( String strKeywords, HttpServletRequest request )
75 {
76 List<Map<String, String>> listResults = new ArrayList<>( );
77 IndexSearcher searcher = null;
78 try ( Directory directory = IndexationService.getDirectoryIndex( ) ; IndexReader ir = DirectoryReader.open( directory ) )
79 {
80 searcher = new IndexSearcher( ir );
81 BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder( );
82
83 if ( ( strKeywords != null ) && !strKeywords.equals( "" ) )
84 {
85 QueryParser parser = new QueryParser( SearchItem.FIELD_CONTENTS, IndexationService.getAnalyser( ) );
86 queryBuilder.add( parser.parse( strKeywords ), BooleanClause.Occur.MUST );
87 }
88
89 TopDocs topDocs = searcher.search( queryBuilder.build( ), LuceneSearchEngine.MAX_RESPONSES );
90 ScoreDoc [ ] hits = topDocs.scoreDocs;
91 for ( int i = 0; i < hits.length; i++ )
92 {
93 int docId = hits [i].doc;
94 Document document = searcher.doc( docId );
95 Map<String, String> listUserResults = new HashMap<>( );
96 for ( IndexableField field : document.getFields( ) )
97 {
98
99 listUserResults.put( field.name( ), field.stringValue( ) );
100
101 }
102 listResults.add( listUserResults );
103 }
104 }
105 catch( Exception e )
106 {
107 AppLogService.error( e.getMessage( ), e );
108 }
109 return listResults;
110 }
111
112 }