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.digglike.service.digglikesearch;
35
36 import fr.paris.lutece.plugins.digglike.business.SubmitFilter;
37 import fr.paris.lutece.plugins.digglike.service.search.DigglikeIndexer;
38 import fr.paris.lutece.portal.service.search.IndexationService;
39 import fr.paris.lutece.portal.service.search.LuceneSearchEngine;
40 import fr.paris.lutece.portal.service.util.AppLogService;
41
42 import java.util.ArrayList;
43 import java.util.Collection;
44 import java.util.List;
45
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.Term;
50 import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
51 import org.apache.lucene.search.BooleanClause;
52 import org.apache.lucene.search.IndexSearcher;
53 import org.apache.lucene.search.Query;
54 import org.apache.lucene.search.ScoreDoc;
55 import org.apache.lucene.search.TermQuery;
56 import org.apache.lucene.search.TopDocs;
57
58
59
60
61
62 public class DigglikeLuceneSearchEngine implements DigglikeSearchEngine
63 {
64
65
66
67
68
69
70
71 public List<DigglikeSearchItem> getSearchResults( String strQuery, SubmitFilter filter )
72 {
73 List<DigglikeSearchItem> listResults = new ArrayList<DigglikeSearchItem>( );
74 IndexSearcher searcher = null;
75
76 try
77 {
78 IndexReader ir = DirectoryReader.open( IndexationService.getDirectoryIndex( ) );
79 searcher = new IndexSearcher( ir );
80
81 Collection<String> queries = new ArrayList<String>( );
82 Collection<String> fields = new ArrayList<String>( );
83 Collection<BooleanClause.Occur> flags = new ArrayList<BooleanClause.Occur>( );
84
85
86 if ( ( strQuery != null ) && !strQuery.equals( "" ) )
87 {
88 Query queryContent = new TermQuery( new Term( DigglikeSearchItem.FIELD_CONTENTS, strQuery ) );
89 queries.add( queryContent.toString( ) );
90 fields.add( DigglikeSearchItem.FIELD_CONTENTS );
91 flags.add( BooleanClause.Occur.MUST );
92 }
93
94
95 if ( filter.containsIdDigg( ) )
96 {
97 Query queryIdDigg = new TermQuery( new Term( DigglikeSearchItem.FIELD_ID_DIGG, String.valueOf( filter
98 .getIdDigg( ) ) ) );
99 queries.add( queryIdDigg.toString( ) );
100 fields.add( DigglikeSearchItem.FIELD_ID_DIGG );
101 flags.add( BooleanClause.Occur.MUST );
102 }
103
104
105 if ( filter.containsIdDiggSubmitState( ) )
106 {
107 Query queryState = new TermQuery( new Term( DigglikeSearchItem.FIELD_STATE, String.valueOf( filter
108 .getIdDiggSubmitState( ) ) ) );
109 queries.add( queryState.toString( ) );
110 fields.add( DigglikeSearchItem.FIELD_STATE );
111 flags.add( BooleanClause.Occur.MUST );
112 }
113
114
115 Query queryTypeDigg = new TermQuery( new Term( DigglikeSearchItem.FIELD_TYPE,
116 DigglikeIndexer.INDEX_TYPE_DIGG ) );
117 queries.add( queryTypeDigg.toString( ) );
118 fields.add( DigglikeSearchItem.FIELD_TYPE );
119 flags.add( BooleanClause.Occur.MUST );
120
121 Query queryMulti = MultiFieldQueryParser.parse( IndexationService.LUCENE_INDEX_VERSION,
122 (String[]) queries.toArray( new String[queries.size( )] ),
123 (String[]) fields.toArray( new String[fields.size( )] ),
124 (BooleanClause.Occur[]) flags.toArray( new BooleanClause.Occur[flags.size( )] ),
125 IndexationService.getAnalyser( ) );
126
127 TopDocs topDocs = searcher.search( queryMulti, LuceneSearchEngine.MAX_RESPONSES );
128 ScoreDoc[] hits = topDocs.scoreDocs;
129
130 for ( int i = 0; i < hits.length; i++ )
131 {
132 int docId = hits[i].doc;
133 Document document = searcher.doc( docId );
134 DigglikeSearchItem si = new DigglikeSearchItem( document );
135 listResults.add( si );
136 }
137 }
138 catch ( Exception e )
139 {
140 AppLogService.error( e.getMessage( ), e );
141 }
142
143 return listResults;
144 }
145 }