lucene的丰富的各种查询
term查询、queryParser查询 ,booleanQuery
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
public class Searcher {
public static void termQuery() throws Exception{
Directory directory = FSDirectory.getDirectory("./index", false);
IndexSearcher searcher = new IndexSearcher(directory);
Term t = new Term("body","document");
Query query = new TermQuery(t);
Hits hits = searcher.search(query);
System.out.println(hits.length());
}
public static void queryParser() throws Exception{
Directory directory = FSDirectory.getDirectory("./index", false);
IndexSearcher searcher = new IndexSearcher(directory);
Query query = QueryParser.parse("text","body",new StandardAnalyzer());
Hits hits = searcher.search(query);
System.out.println(hits.length());
}
public static void booleanQuery() throws Exception{
Query parseQuery = QueryParser.parse("text","body",new StandardAnalyzer());
Term t = new Term("body","document");
Query termQuery = new TermQuery(t);
BooleanQuery boolQuery = new BooleanQuery();
boolQuery.add(parseQuery,true,false);
boolQuery.add(termQuery,true,false);
Directory directory = FSDirectory.getDirectory("./index", false);
IndexSearcher searcher = new IndexSearcher(directory);
Hits hits = searcher.search(boolQuery);
System.out.println(hits.length());
}
public static void main(String[] args) throws Exception{
termQuery();
queryParser();
booleanQuery();
}
}
和上文一样,列写lucene的查询用法
包括了RangeQuery prefixQuery phraseQuery wildcastQuery fuzzyQuery
被索引查询的文件,按照需求自己构造即可。
package search;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
public class SearcherShow {
private static Directory directory = new RAMDirectory();
public static void preIndex() throws Exception{
String fileName1 = "./data/searchShow.txt";
String fileName2 = "./data/searchShow2.txt";
String fileName3 = "./data/test.txt";
IndexWriter writer = new IndexWriter(directory,new StandardAnalyzer(),true);
Document doc1 = getDocument(fileName1);
Document doc2 = getDocument(fileName2);
Document doc3 = getDocument(fileName3);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.addDocument(doc3);
writer.close();
}
//先建立索引才能执行
//termQuery rangeQuery booleanQuery的查询在Searcher类中
public static void rangeQuery() throws Exception{
Term startTerm = new Term("lastmodified","20070620");
Term endTerm = new Term("lastmodified","20070622");
RangeQuery query = new RangeQuery(startTerm,endTerm,true);
IndexSearcher searcher = new IndexSearcher(directory);
Hits hits = searcher.search(query);
prtHits(hits);
}
public static void prefixQuery() throws Exception{
Term term = new Term("fileName","searchShow.txt");
Term prefixterm = new Term("fileName","searchShow");
IndexSearcher searcher = new IndexSearcher(directory);
Query query = new TermQuery(term);
Query prefixQuery = new PrefixQuery(prefixterm);
Hits hits = searcher.search(query);
Hits prefixHits = searcher.search(prefixQuery);
prtHits(hits);
System.out.println("----------");
prtHits(prefixHits);
}
public static void phraseQuery() throws Exception{
IndexSearcher searcher = new IndexSearcher(directory);
PhraseQuery query = new PhraseQuery();
query.setSlop(2);
query.add(new Term("contents","quick"));
query.add(new Term("contents","fox"));
Hits hits = searcher.search(query);
prtHits(hits);
}
public static void wildcardQuery() throws Exception{
IndexSearcher searcher = new IndexSearcher(directory);
Query query = new WildcardQuery(new Term("contents","?ild*"));
Hits hits = searcher.search(query);
prtHits(hits);
}
public static void fuzzyQuery() throws Exception{
IndexSearcher searcher = new IndexSearcher(directory);
Term term = new Term("contents","wuzza");
FuzzyQuery query = new FuzzyQuery(term);
Hits hits = searcher.search(query);
prtHits(hits);
}
public static Document getDocument(String fileName) throws Exception{
File file = new File(fileName);
Document doc = new Document();
doc.add(Field.Keyword("fileName",file.getName() ));
Date modified = new Date(file.lastModified());
String lastmodified = new SimpleDateFormat("yyyyMMdd").format(modified);
doc.add(Field.Keyword("lastmodified", lastmodified));
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
StringBuffer sb = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
}
br.close();
doc.add(Field.Text("contents",sb.toString() ));
return doc;
}
public static void prtHits(Hits hits) throws Exception{
for(int i=0;i<hits.length();i++){
Document doc = hits.doc(i);
System.out.println(doc.get("fileName"));
System.out.println(doc.get("lastmodified"));
}
}
public static void main(String[] args) throws Exception{
preIndex();
// rangeQuery();
// prefixQuery();
// phraseQuery();
// wildcardQuery();
fuzzyQuery();
}
}