`
kevintse
  • 浏览: 10928 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

封装一个使用Lucene API的通用搜索函数

阅读更多
	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的小常识

    Lucene,作为Apache软件基金会的一个开放源代码项目,是一款高性能、全文本搜索引擎库,被广泛应用于各种搜索应用中,尤其在文献垂直搜索领域表现卓越。垂直搜索,顾名思义,是指针对某一特定行业或主题进行深入、...

    lucene in action

    虽然Lucene是一个非常强大且成熟的搜索库,但在某些场景下可能需要考虑其他替代方案。例如,在面对大规模数据时,Elasticsearch或Solr可能是更好的选择。这些系统通常提供了更多的高级功能,如分布式搜索和实时数据...

    php+elastic2.0

    封装Elasticsearch客户端意味着将复杂的API调用隐藏在自定义类或函数后面,创建一个更易于理解和使用的接口。这通常包括以下步骤: 1. **初始化客户端**: 创建一个客户端实例,配置服务器地址、端口、认证信息等。 ...

    java开源包8

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包11

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包1

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包2

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包3

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包6

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包5

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包10

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包4

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包7

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包9

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    java开源包101

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    Java资源包01

    jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。提供了一个基于对象模型的 ActionScript 字节码,并提供了 ActionScript 字节码统计工具。 Java类重加载工具 JReloader JReloader 是一个用来重新...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    Java进阶路线

    并发编程是Java中一个重要的主题,涉及到线程安全、同步机制等多个方面: - **Thread**:Java 中的基本线程类。 - **Runnable**:实现此接口以定义线程的执行体。 - **Synchronized**:关键字用于同步方法或代码块...

Global site tag (gtag.js) - Google Analytics