Lucence的各种查询

来源:互联网 发布:java开发者论坛 编辑:程序博客网 时间:2024/06/05 06:33
package org.adv.lucene.util;


import java.io.IOException;
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.index.CorruptIndexException;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.util.Version;


public class SearchTest {

private static IndexReader reader = null;
static {
try {
reader = DirectoryReader.open(FileIndexUtils.getDirectory());
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 获取IndexSearcher
* @return
*/
public IndexSearcher getSearcher() {
try {
if(reader==null) {
reader = DirectoryReader.open(FileIndexUtils.getDirectory());
} else {
IndexReader tr = DirectoryReader.openIfChanged((DirectoryReader)reader);
if(tr!=null) {
reader.close();
reader = tr;
}
}
return new IndexSearcher(reader);
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

/**
* 带过滤器的查询
* @param queryStr
* @param filter
*/
public void searcherByFilter(String queryStr,Filter filter) {
try {
IndexSearcher searcher = getSearcher();
QueryParser parser = new QueryParser(Version.LUCENE_4_9,"content",new StandardAnalyzer(Version.LUCENE_4_9));
Query query = parser.parse(queryStr);
TopDocs tds = null;
if(filter!=null)
tds = searcher.search(query,filter,550);
else {
tds = searcher.search(query, 550);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
for(ScoreDoc sd:tds.scoreDocs) {
Document d = searcher.doc(sd.doc);
System.out.println(sd.doc+":("+sd.score+")" +
"["+d.get("filename")+"["+d.get("path")+"]--->"+
d.get("size")+"-----"+sdf.format(new Date(Long.valueOf(d.get("date"))))+"]");
}
searcher.getIndexReader().close();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 根据不同的域进行排序查询
* @param queryStr
* @param sort
*/
public void searcherBySort(String queryStr,Sort sort) {
try {
IndexSearcher searcher = getSearcher();
QueryParser parser = new QueryParser(Version.LUCENE_4_9,"content",new StandardAnalyzer(Version.LUCENE_4_9));
Query query = parser.parse(queryStr);
TopDocs tds = null;
if(sort!=null)
tds = searcher.search(query, 550, sort);
else {
tds = searcher.search(query, 550);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
for(ScoreDoc sd:tds.scoreDocs) {
Document d = searcher.doc(sd.doc);
System.out.println(sd.doc+":("+sd.score+")" +
"["+d.get("filename")+"["+d.get("path")+"]---"+d.get("score")+"--->"+
d.get("size")+"-----"+sdf.format(new Date(Long.valueOf(d.get("date"))))+"]");
}
//searcher.getIndexReader().close();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 根据Query查询 
* @param queryStr
*/
public void searcherByQuery(Query queryStr) {
try {
IndexSearcher searcher = getSearcher();
TopDocs tds = null;
tds = searcher.search(queryStr, 550);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
for(ScoreDoc sd:tds.scoreDocs) {
Document d = searcher.doc(sd.doc);
System.out.println(sd.doc+":("+sd.score+")" +
"["+d.get("filename")+"["+d.get("path")+"]--->"+
d.get("size")+"-----"+sdf.format(new Date(Long.valueOf(d.get("date"))))+"]");
}
searcher.getIndexReader().close();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}



package org.adv.lucene.test;


import org.apache.lucene.index.Term;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.NumericRangeFilter;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermRangeFilter;
import org.apache.lucene.search.WildcardQuery;
import org.adv.lucene.util.FileIndexUtils;
import org.adv.lucene.util.SearchTest;
import org.junit.Before;
import org.junit.Test;


public class TestSearch {
private SearchTest st;

@Before
public void init() {
st = new SearchTest();
}



@Test
public void index() {
FileIndexUtils.index(true);
}


/***
* 测试根据不同的域进行排序查询
*/

@Test
public void test01() {
//Sort.INDEXORDER通过doc的id进行排序
// st.searcherBySort("java",Sort.INDEXORDER);

//使用默认的评分排序
//st.searcherBySort("java", Sort.RELEVANCE);

//st.searcherBySort("java", null);

//通过文件的大小排序
//st.searcherBySort("java",new Sort(new SortField("size",SortField.Type.INT)));
//通过日期排序
//st.searcherBySort("java",new Sort(new SortField("date",SortField.Type.LONG)));
//通过文件名排序
//st.searcherBySort("java", new Sort(new SortField("filename", SortField.Type.STRING)));

//System.out.println("-----------------------");

//通过设置SortField最后一个参数设置是否反转排序
//st.searcherBySort("java", new Sort(new SortField("filename", SortField.Type.STRING,true)));
   
//使用多个域排序,使用size域,和文档的默认评分排序
st.searcherBySort("java", new Sort(new SortField("size",SortField.Type.INT),SortField.FIELD_SCORE));
}

/**
* 根据条件来过滤查询
*/
@Test
public void test02() {
Filter tr = TermRangeFilter.newStringRange("filename", "impalad.she","statestored.ba",true, true);
//tr = NumericRangeFilter.newIntRange("size",2000,3900,true,true);
//可以通过一个Query进行过滤
tr = new QueryWrapperFilter(new WildcardQuery(new Term("filename","*.she")));
st.searcherByFilter("java", tr);
}

/**
* 根据Query来查询
*/
@Test
public void test03() {
Query q = new WildcardQuery(new Term("filename","?m*"));
st.searcherByQuery(q);
}
}





0 0
原创粉丝点击