Examples for All of Lucene's Query Classes.
The following code has examples how to call each of the various Lucene Query classes.
/*
* Created on Apr 21, 2003
*
*/
package com.affy.lucene.examples;
import java.io.IOException;
import java.util.LinkedList;
import org.apache.lucene.analysis.standard.*;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.store.*;
public class RunAllQueries {
public static void main(String[] args)
throws IOException, ParseException {
RAMDirectory indexStore = new RAMDirectory();
Query query = null;
String docs[] = {
"aaa bbb ccc",
"aaa ddd eee",
"aaa ddd fff",
"aaa dee fff",
"AAA fff ggg",
"ggg hhh iii",
"123 123 1z2", // document containing z for
// WildcardQuery example.
"999 123 123", // document for fuzzy search.
"9x9 123 123", // document for fuzzy search.
"99 123 123", // document for fuzzy search.
"xxx yyy zzz"
};
IndexWriter writer = new IndexWriter(indexStore,
new StandardAnalyzer(), true);
for (int j = 0; j < docs.length; j++) {
Document d = new Document();
d.add(Field.Text("body", docs[j]));
writer.addDocument(d);
}
writer.close();
IndexReader indexReader = IndexReader.open(indexStore);
System.out.println("Searchable Documents: "
+ indexReader.numDocs());
System.out.println("");
System.out.println("NOTE: This search is"
+ " case-insensitive.");
System.out.println("--------------------------------");
System.out.println("");
System.out.println("****** BooleanQuery Example *******");
System.out.println("FIND DOCUMENTS WITH "
+ "AAA, GGG, or XXX");
System.out.println("-------------------------------");
BooleanQuery bq = new BooleanQuery();
Term aaa = new Term("body", "aaa");
Term ggg = new Term("body", "ggg");
Term xxx = new Term("body", "xxx");
bq.add(new TermQuery(aaa), false, false);
bq.add(new TermQuery(ggg), false, false);
bq.add(new TermQuery(xxx), false, false);
RunAllQueries.runQueryAndDisplayResults(indexStore, bq);
System.out.println("");
System.out.println("FIND DOCUMENTS WITH AAA or Z*");
System.out.println("------------------------------------");
bq = new BooleanQuery();
bq.add(new TermQuery(new Term("body", "aaa")), false, false);
bq.add(new PrefixQuery(new Term("body", "z")), false, false);
RunAllQueries.runQueryAndDisplayResults(indexStore, bq);
System.out.println("\n****** DocFreq Example ******");
System.out.println("Frequency of 'DDD' Term: "
+ indexReader.docFreq(new Term("body", "ddd")));
System.out.println("\n****** FuzzyQuery Example *******");
System.out.println("DOCUMENTS SIMILAR TO 999."
+ " NOTE THAT 9x9 IS FOUND BUT NOT 99");
System.out.println("------------------"
+ "-----------------------------------------");
query = new FuzzyQuery(new Term("body", "999"));
RunAllQueries.runQueryAndDisplayResults(indexStore, query);
System.out.println("\n*** PhrasePrefixQuery Example ****");
// First, print all searchable terms.
System.out.println("ALL SEARCHABLE TERMS");
System.out.println("--------------------");
LinkedList termsWithPrefix = new LinkedList();
TermEnum te = indexReader.terms();
do {
if (te.term() != null) {
if (te.term().text() != null) {
System.out.println("!" + te.term().text() + "!");
}
}
} while (te.next());
// Second, show that terms() returns terms
// that from the specified term to the end
// of the term list. So if you look for
// pi* then paa would not be found. However,
// phh and saa would be found.
System.out.println("");
System.out.println("SEARCHABLE TERMS FROM H to Z");
System.out.println("---------------------------");
termsWithPrefix = new LinkedList();
te = indexReader.terms(new Term("body", "h*"));
do {
System.out.println(te.term().text());
} while (te.next());
// Use pattern-matching to find terms that start
// with the letter h.
System.out.println("");
System.out.println("SEARCHABLE TERMS STARTING WITH D");
System.out.println("--------------------------------");
termsWithPrefix = new LinkedList();
String pattern = "d*";
te = indexReader.terms(new Term("body", pattern));
while (te.term().text().matches(pattern)) {
System.out.println(te.term().text());
termsWithPrefix.add(te.term());
if (te.next() == false)
break;
}
// Find documents that match "aaa h*".
PhrasePrefixQuery ppq = new PhrasePrefixQuery();
ppq.add(new Term("body", "aaa"));
ppq.add((Term[]) termsWithPrefix.toArray(new Term[0]));
System.out.println("");
RunAllQueries.runQueryAndDisplayResults(indexStore, ppq);
System.out.println("\n****** PhraseQuery Example ******");
System.out.println("NOTE: 2 documents are found "
+ "with 'aaa ddd' in order.");
System.out.println("--------------"
+ "------------------------");
PhraseQuery pq = new PhraseQuery();
pq.add(new Term("body", "aaa"));
pq.add(new Term("body", "ddd"));
RunAllQueries.runQueryAndDisplayResults(indexStore, pq);
System.out.println("");
System.out.println("NOTE: ZERO documents are"
+ " found with 'xxx ddd' in order.");
System.out.println("-----------"
+ "---------------------------");
pq = new PhraseQuery();
pq.add(new Term("body", "xxx"));
pq.add(new Term("body", "ddd"));
RunAllQueries.runQueryAndDisplayResults(indexStore, pq);
System.out.println("\n****** PrefixQuery Example ******");
System.out.println("DOCUMENTS STARTING WITH D");
System.out.println("-------------------------");
query = new PrefixQuery(new Term("body", "d"));
RunAllQueries.runQueryAndDisplayResults(indexStore, query);
System.out.println("\n****** RangeQuery Example ******");
System.out.println("DOCUMENTS FROM"
+ " AAA to FFF, not inclusive");
System.out.println("-------------"
+ "----------------------------------");
Term t1 = new Term("body", "aaa");
Term t2 = new Term("body", "fff");
query = new RangeQuery(t1, t2, false);
RunAllQueries.runQueryAndDisplayResults(indexStore, query);
System.out.println("");
System.out.println("DOCUMENTS FROM AAA"
+ " to FFF, inclusive");
System.out.println("---------------------------------");
query = new RangeQuery(t1, t2, true);
RunAllQueries.runQueryAndDisplayResults(indexStore, query);
System.out.println("\n***** TermQuery Example *****");
System.out.println("DOCUMENTS THAT CONTAIN AAA");
System.out.println("--------------------------");
query = new TermQuery(new Term("body", "aaa"));
RunAllQueries.runQueryAndDisplayResults(indexStore, query);
System.out.println("\n***** WildcardQuery Example *****");
System.out.println("DOCUMENTS STARTING WITH D");
System.out.println("-------------------------------");
query = new WildcardQuery(new Term("body", "d*"));
RunAllQueries.runQueryAndDisplayResults(indexStore, query);
System.out.println("");
System.out.println("DOCUMENTS ENDING WITH E");
System.out.println("--------------------------------");
query = new WildcardQuery(new Term("body", "*e"));
RunAllQueries.runQueryAndDisplayResults(indexStore, query);
System.out.println("");
System.out.println("DOCUMENTS THAT CONTAIN Z");
System.out.println("--------------------------------");
query = new WildcardQuery(new Term("body", "*z*"));
RunAllQueries.runQueryAndDisplayResults(indexStore, query);
System.out.println("");
System.out.println("Done.");
}
public static void
runQueryAndDisplayResults(Directory indexStore, Query q)
throws IOException {
IndexSearcher searcher = new IndexSearcher(indexStore);
Hits hits = searcher.search(q);
int _length = hits.length();
System.out.println("HITS: " + _length);
for (int i = 0; i < _length; i++) {
Document doc = hits.doc(i);
Field field = doc.getField("body");
System.out.println(" value: " + field.stringValue());
}
searcher.close();
}
}