/**
 * 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();
    }
}