Archives: Lucene

Java Lucene – Simple Index and Search Example

[code lang=”java”]/**
* A simple example of an in-memory indexing and searching using Lucene.
*/
import java.io.IOException;
import java.io.StringReader;

import org.apache.lucene.search.Hits;
import org.apache.lucene.search.Query;
import org.apache.lucene.document.Field;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.document.Document;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;

public class InMemoryExample {

public static void main(String[] args) {
// Construct a RAMDirectory to hold the in-memory representation of the index.
RAMDirectory idx = new RAMDirectory();

// To store an index on disk, use this instead (note that the
// parameter true will overwrite the index in that directory if one exists):
// Directory idx = FSDirectory.getDirectory("/tmp/testindex", true);

try {
// Make an writer to create the index
IndexWriter writer = new IndexWriter(idx, new StandardAnalyzer(), true);

// Add some Document objects containing quotes
writer.addDocument(createDocument("Ayn Rand",
"There is nothing to take a man’s freedom away from him, save other men. " +
"To be free, a man must be free of his brothers."));
writer.addDocument(createDocument("Mohandas Gandhi",
"Freedom is not worth having if it does not connote freedom to err."));

// Optimize and close the writer to finish building the index
writer.optimize();
writer.close();

// Build an IndexSearcher using the in-memory index
Searcher searcher = new IndexSearcher(idx);

// Run some queries
search(searcher, "freedom");
search(searcher, "free");

searcher.close();
}
catch(IOException ioe) {
ioe.printStackTrace();
}
catch(ParseException pe) {
pe.printStackTrace();
}
}

/**
* Make a Document object with an un-indexed title field and an
* indexed content field.
*/
private static Document createDocument(String title, String content) {
Document doc = new Document();

// Add the title as an unindexed field…
doc.add(Field.UnIndexed("title", title));

// just wrap the content string in a StringReader.
doc.add(Field.Text("content", new StringReader(content)));

return doc;
}

/**
* Searches for the given string in the "content" field
*/
private static void search(Searcher searcher, String queryString)
throws ParseException, IOException {

// Build a Query object
Query query = QueryParser.parse(queryString, "content", new StandardAnalyzer());

// Search for the query
Hits hits = searcher.search(query);

// Examine the Hits object to see if there were any matches
int hitCount = hits.length();
if (hitCount == 0) {
System.out.println(
"No matches were found for \"" + queryString + "\"");
}
else {
System.out.println("Hits for \"" +
queryString + "\" were found in quotes by:");

// Iterate over the Documents in the Hits object
for (int i = 0; i < hitCount; i++) {
Document doc = hits.doc(i);

// Print the value that we stored in the "title" field. Note that this Field was not indexed,
// but (unlike the "contents" field) was stored verbatim and can be retrieved.
System.out.println(" " + (i + 1) + ". " + doc.get("title"));
}
}
System.out.println();
}
}[/code]