Simple Lucene Example
Lucene is a great core for a Java search engine. Here is simple Lucene example code to index simple single field data along with a very basic search function. This will create simple Java search engine. For this simple lucene example code, each block is catching the thrown exceptions so you can see what is thrown. In a real world lucene implementation, you may handle this differently.
Lucene Example Code: Steps to Index the data
- Create a new Lucene index using an IndexWriter
Create a Lucene Document
Add the Lucene document to the index
Optimize and close the index
Create a new Lucene index using an IndexWriter
String indexPath = "/path/to/whereYou/wantThe/IndexStored"; IndexWriter writer = null;
try {
// Make a lucene writer and create new Lucene index with arg3 = true
writer = new IndexWriter(indexPath, new StandardAnalyzer(), true);
} catch (IOException e) {
System.out.println("IOException opening Lucene IndexWriter: " + e.getMessage());
}
Create a Lucene document
String content = "This is the example text I want to have Lucene index"; Document doc = new Document();
doc.add(Field.Text("content",content));
Add the document to the index
try { writer.addDocument(doc);
} catch (IOException e) {
System.out.println("IOException adding Lucene Document: " + e.getMessage());
}
Optimize and close the IndexWriter
try { writer.optimize();
writer.close();
catch (IOException e) {
System.out.println("IOException closing Lucene IndexWriter: " + e.getMessage());
}
Lucene Example Code: Steps to Search the Lucene Index
Open a Lucene IndexSearcher
IndexSearcher indexSearcher = new IndexSearcher(indexPath);
If you are using the Lucene search engine from a web page, you should store and reuse the same IndexSearcher for each query. The Lucene IndexSearcher caches information to make queries after the first one faster. Reusing the Lucene IndexSearcher also takes it easy on the Java garbage collector, increasing performance and memory utilization. Not reusing the IndexSearcher is a common mistake and cause of frustration for many first time lucene users. For use on the web, here is some simple JSP code to store the IndexSearcher in an application attribute and reuse it for future page loads.
indexSearcher = (IndexSearcher) application.getAttribute("searcher"); if(indexSearcher == null){
indexSearcher = new IndexSearcher(indexPath);
application.setAttribute("searcher",indexSearcher);
}
Construct a Lucene Query
String queryString = "example"; try {
Query query = QueryParser.parse(queryString,"content",new StandardAnalyzer());
} catch (ParseException e) {
System.out.println("Lucene ParseException: " + e. getMessage);
e.printStackTrace();
}
Have Lucene perform the Search
Hits hits = null; try {
Hits hits = indexSearcher.search(query);
catch (IOException e) {
System.out.println("Lucene Searching Exception: " + e.getMessage());
}
Display the top Lucene Hits
int hitCount = hits.length(); for(int i=0; (i < hitCount && i < 10); i++){
Document doc = hits.doc(i);
System.out.println(doc.get("content"));
}
That’s it!
Those are the bits needed to create a simple, one field, Lucene search engine in Java. In terms of the try and catch block and variables, you’d probably implement things in a more combined manor, but the samples on this page are designed at least at some level to exist in isolation from each other.
Want a more powerful Search Engine?
I also have a Multi-Field Search Engine Example if you want to get a little bit more powerful.
I have used the API and available .dll file in .NET environment.
On my local pc everything is running fine but when I posted the indexed folder under the bin directory of website (shared hosting) then IndexSearcher started throwing the error “The type initializer for ‘Lucene.Net.Store.FSDirectory’ threw an exception”
Please Note:
Indexing is done offline on my PC and I just want the indexer to search the indexed stuff on the web. The Path is causing issues.
Can you provide which path I have to use? I am not sure if I require some additional permissions to give to ASPNET user and that may not be possible on shared-hosting.
Thanks in anticipation.
Regards
Comment by Sakhi — June 7, 2009 @ 12:15 am