Xcos search: index help JARs
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / palette / PaletteSearcher.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2015 - Marcos CARDINOT
4  * Copyright (C) 2017 - Scilab Enterprises - Clement DAVID
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.xcos.palette;
15
16 import java.io.IOException;
17 import java.util.ArrayList;
18 import java.util.List;
19 import java.util.logging.Level;
20 import java.util.logging.Logger;
21
22 import org.apache.lucene.document.Document;
23 import org.apache.lucene.index.DirectoryReader;
24 import org.apache.lucene.index.IndexReader;
25 import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
26 import org.apache.lucene.queryparser.flexible.standard.StandardQueryParser;
27 import org.apache.lucene.search.IndexSearcher;
28 import org.apache.lucene.search.Query;
29 import org.apache.lucene.search.ScoreDoc;
30 import org.apache.lucene.search.TopDocs;
31 import org.scilab.modules.xcos.utils.XcosConstants;
32
33 /**
34  * Handles a near real time IndexReader from the IndexWriter.
35  * @author Marcos Cardinot <mcardinot@gmail.com>
36  */
37 public final class PaletteSearcher {
38
39     private PaletteSearchManager mgr;
40
41     /**
42      * Default constructor
43      * @param psm PaletteSearchManager
44      */
45     public PaletteSearcher(PaletteSearchManager psm) {
46         mgr = psm;
47     }
48
49     /**
50      * @param str Query
51      * @return paths to the found blocks
52      */
53     public List<Document> search(String str) {
54         List<Document> found = new ArrayList<>();
55         try (IndexReader reader = DirectoryReader.open(mgr.getIndexWriter(), true)) {
56             IndexSearcher searcher = new IndexSearcher(reader);
57
58             StandardQueryParser queryParserHelper = new StandardQueryParser();
59             queryParserHelper.setAllowLeadingWildcard(true);
60             queryParserHelper.setLowercaseExpandedTerms(true);
61             queryParserHelper.setAnalyzer(mgr.getAnalyzer());
62             queryParserHelper.setMultiFields(new String[] {"refname", "refpurpose", "content"});
63
64             Query query = queryParserHelper.parse(str, null);
65             TopDocs results  = searcher.search(query, XcosConstants.MAX_HITS);
66             ScoreDoc[] hits = results.scoreDocs;
67
68             if (hits.length == 0) {
69                 query = queryParserHelper.parse("*" + str + "*", null);
70                 results  = searcher.search(query, XcosConstants.MAX_HITS);
71                 hits = results.scoreDocs;
72             }
73
74             for (int i = 0; i < hits.length; i++) {
75                 Document doc = searcher.doc(hits[i].doc);
76                 found.add(doc);
77             }
78         } catch (IOException | QueryNodeException e) {
79             Logger.getLogger(PaletteSearcher.class.getName()).log(Level.SEVERE, null, e);
80         }
81         return found;
82     }
83 }