public interface DocFetcher<T> {
public T get (Document doc);
}
private IndexSearcher searcher;
private Analyzer analyzer;
/**
* @param fields - fields that this search bases on
* @param keywords
* @param flags - indicates whether the search should use a QueryParser to parse the keywords for the specified fields or just use a TermQuery for exact match. the length of the flags array MUST be the same as that of fields
* @param filter - may be null
* @param sort - null if sorting the result is not required
* @return count of documents that this search has found
*/
public <T> int search (String[] fields, boolean[] flags, String[] keywords, Filter filter, Sort sort, int pageNo, int pageSize, List<T> result, DocFetcher<T> ft) {
try {
long start = System.currentTimeMillis();
StringBuffer fieldStr = new StringBuffer();
StringBuffer keywordStr = new StringBuffer();
QueryParser parser = null;
BooleanQuery bq = new BooleanQuery();
for (int i = 0; i < fields.length; ++i) {
if (flags[i])
parser = new QueryParser(Version.LUCENE_CURRENT, fields[i], analyzer);
BooleanQuery bqInner = new BooleanQuery();
for (int j = 0; j < keywords.length; ++j) {
if (flags[i])
bqInner.add(parser.parse(keywords[j]), BooleanClause.Occur.MUST);
else bqInner.add(new TermQuery(new Term(fields[i], keywords[j])), BooleanClause.Occur.MUST);
}
bq.add(bqInner, BooleanClause.Occur.SHOULD);
fieldStr.append('[').append(fields[i]).append("] ");
}
for (int i = 0; i < keywords.length; ++i)
keywordStr.append('[').append(keywords[i]).append("] ");
infoLogger.info("##########Query starts#########");
infoLogger.info("##FIELDS: " + fieldStr.toString());
infoLogger.info("##KEYWORDS: " + keywordStr.toString());
if (pageNo <= 0) pageNo = 1;
if (pageSize <= 0) pageSize = 1;
int limit = pageNo * pageSize;
TopDocs hits = sort != null ? searcher.search(bq, filter, limit, sort) : searcher.search(bq, filter, limit);
ScoreDoc[] scoreDocs = hits.scoreDocs;
int startIndex = pageNo * pageSize - pageSize;
if (startIndex > scoreDocs.length)
startIndex = (scoreDocs.length / pageSize) * pageSize; //last page
for (int i = startIndex; i < scoreDocs.length; ++i) {
result.add(ft.get(searcher.doc(scoreDocs[i].doc)));
}
long interval = System.currentTimeMillis() - start;
StringBuffer sb = new StringBuffer();
infoLogger.info(sb.append("########## ").append(hits.totalHits).append(" Documents Found. (").append(interval / 1000).append(" seconds ").append(interval % 1000).append(" milliseconds").append(") #########").toString());
return hits.totalHits;
} catch (Exception ex) {
exceptionLogger.fatal("Error occurs when searching.");
exceptionLogger.fatal(ex.getMessage(), ex);
}
return 0;
}
分享到:
相关推荐
Lucene,作为Apache软件基金会的一个开放源代码项目,是一款高性能、全文本搜索引擎库,被广泛应用于各种搜索应用中,尤其在文献垂直搜索领域表现卓越。垂直搜索,顾名思义,是指针对某一特定行业或主题进行深入、...
虽然Lucene是一个非常强大且成熟的搜索库,但在某些场景下可能需要考虑其他替代方案。例如,在面对大规模数据时,Elasticsearch或Solr可能是更好的选择。这些系统通常提供了更多的高级功能,如分布式搜索和实时数据...
封装Elasticsearch客户端意味着将复杂的API调用隐藏在自定义类或函数后面,创建一个更易于理解和使用的接口。这通常包括以下步骤: 1. **初始化客户端**: 创建一个客户端实例,配置服务器地址、端口、认证信息等。 ...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...
5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
并发编程是Java中一个重要的主题,涉及到线程安全、同步机制等多个方面: - **Thread**:Java 中的基本线程类。 - **Runnable**:实现此接口以定义线程的执行体。 - **Synchronized**:关键字用于同步方法或代码块...