package fr.inra.lipm.jezlucene.action;
import java.io.IOException;
import java.util.List;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.FSDirectory;
import org.kohsuke.args4j.Option;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
import fr.inra.lipm.jezlucene.Converter;
import fr.inra.lipm.jezlucene.cfg.Configuration;
/**
* @author llegrand
*/
public class Search extends Action {
private static Logger logger = LoggerFactory.getLogger(Search.class);
@Option(required = true, name = "-q", aliases = { "--query" }, usage = "query")
private String query;
public String search() throws IOException {
final IndexReader indexReader = DirectoryReader.open(FSDirectory.open(this.store));
final IndexSearcher indexSearcher = new IndexSearcher(indexReader);
final QueryParser queryParser = new QueryParser(Configuration.VERSION, "", Configuration.ANALYZER);
try {
final Query validQuery = queryParser.parse(this.query);
final TopScoreDocCollector hits = TopScoreDocCollector.create(10, true);
indexSearcher.search(validQuery, hits);
final List<Document> documents = Lists.newArrayList();
for (int index = 0; index <= hits.getTotalHits(); index++) {
documents.add(indexSearcher.doc(index));
}
return Converter.document2JSON(documents);
}
catch (final ParseException e) {
logger.error("Malformed lucene query: {}", e.getMessage());
logger.trace("Stacktrace", e.fillInStackTrace());
}
return null;
}
}