lucene为程序添加搜索功能,此功能基于已创建好的文档的索引之上。这里我已经为一些文档建立了索引,并保存到硬盘上。下面开始针对这些索引,添加搜索功能。
1、简单的TermQuery搜索
/**
* 【TermQuery方式搜索】
*
* 对特定的项进行查询,如filename等于XPP3-LICENSE.txt的文件
* @throws Exception
*/
public void testTerm() throws Exception {
Directory dir=FSDirectory.open(new File("d:/index/book_index/"));
IndexSearcher searcher=new IndexSearcher(dir);
Term t=new Term("content","params");
Query query=new TermQuery(t);
TopDocs docs=searcher.search(query, 10);
System.out.println(docs.totalHits+"--------");
t=new Term("filename","version");
docs=searcher.search(new TermQuery(t), 10);
System.out.println(docs.totalHits);
searcher.close();
dir.close();
}
2、使用QueryParser转化用户复杂输入,进行与或非查询操作。
/**
* 【QueryParser查询】
*
*
* 模糊查询,与,或,非方式
* @throws Exception
*/
public void testQueryParse() throws Exception{
Directory dir=FSDirectory.open(new File("d:/index/book_index/"));
IndexSearcher search=new IndexSearcher(dir);
QueryParser parser=new QueryParser(Version.LUCENE_30,"content",new SimpleAnalyzer());
Query query=parser.parse("+ADVISED +POSSIBILITY -JAVA");
TopDocs docs=search.search(query, 10);
/ assertEquals(1, docs.totalHits);
Document document=search.doc(docs.scoreDocs[0].doc);
System.out.println("查询第一个的名称"+document.get("filename"));
System.out.println("与或非查询个数"+docs.totalHits);
query=parser.parse("Indiana OR University");
docs=search.search(query, 10);
System.out.println("Or查询个数"+docs.totalHits);
search.close();
dir.close();
}
查询表达式
|
匹配文档
|
Java
|
默认域包含有Java项的文档
|
Java junit
Java OR junit
|
默认域包含有Java,junit中一个,或者两个的文档
|
+Java +junit
Java AND junit
|
默认域同时包含有Java和junit的文档
|
Title:ant
|
Title域中包含有ant的文档
|
Title:extreme -subject:sport
Title:extreme AND NOT subject:sport
|
Title域中包含extreme而且subject域中不包含sport
|
(agile OR extreme) AND methody
|
默认域包含有methody且包含agile或者extreme中的一个
|
Title:“junit in action”
|
Title域一定为junit in action的文档
|
Title:“junit action“ -5
|
Title域中junit和action的间隔小于5的文档
|
Java*
|
包含有Java开头的文档,如Javascript,Javaserver,Java等
|
Java~
|
包含与Java单词相近的文档,如Java
|
Lastdate:[1/1/09 TO 12/31/09]
|
Lastdate域在09年1月1号到09年12月31号的文档
|
3、近实时搜索
/**
* 【近实时搜索】
*
* @throws Exception
*/
public void testNRTsearch() throws Exception{
Directory dir=new RAMDirectory();
IndexWriter writer=new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED);
for (int i = 0; i < 10; i++) {
Document doc=new Document();
doc.add(new Field("id", ""+i, Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS));
doc.add(new Field("text", "aaa", Field.Store.NO, Field.Index.ANALYZED ));
writer.addDocument(doc);
}
IndexReader reader=writer.getReader();
IndexSearcher searcher=new IndexSearcher(reader);
Query query=new TermQuery(new Term("text","aaa"));
TopDocs docs=searcher.search(query, 1);
System.out.println("[搜索的总数]"+docs.totalHits);
//先删除id为7的文档,然后添加一个id为22的文档,进行搜索,看是不是近实时的
writer.deleteDocuments(new Term("id","7"));
Document doc=new Document();
doc.add(new Field("id", "22", Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS));
doc.add(new Field("text","bbb",Field.Store.NO,Field.Index.ANALYZED));
writer.addDocument(doc);
//重启reader,然后搜索
IndexReader newReader=reader.reopen();
assertEquals(reader==newReader,false);
reader.close();
searcher=new IndexSearcher(newReader);
TopDocs hits=searcher.search(query, 10);
assertEquals(9, hits.totalHits);
query=new TermQuery(new Term("text","bbb"));
hits=searcher.search(query, 10);
System.out.println("bbb文档的个数:"+hits.totalHits);
//关闭资源
newReader.close();
writer.close();
}
分享到:
相关推荐
lucene3.6 搜索例子
第三章 搜索功能 8 3.1 简单搜索 8 (1) 创建IndexReader 8 (2) 创建IndexSearcher 8 (3) 创建Term和TermQuery 9 (5) 根据TopDocs获取ScoreDoc 9 (6) 根据ScoreDoc获取相应文档 9 3.2 其他搜索 9 (1) 范围查询...
lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全(lucene3.6 模仿百度自动补全
在网上找了实例,但是发现不能使用,只能简历索引。...lucene3.6版本,能够建立索引,能搜索。inderwriter,indexsearch. 其中包C下的helloword实例能用,其余的全是网上不能用的。直接下载 可以运行
lucene 3.6 的入门例子 代码简洁 注释清晰 是入门只必备啊 附带了ik中文分词器 支持 停用词 扩展词等
这个是使用lucene实现全文检索的jar包 包含IkAnalyer jar这个分词器 使用非常方便
NULL 博文链接:https://yuan-bin1990.iteye.com/blog/1700272
说明: 例子是根据lucene3.6写的,也可以说是直接copy别人的。 包括参考文章的代码,以及修改部分之后的代码
修复IKAnalyzer2012存在的无法添加扩展的中文停用词的bug。详见:http://blog.csdn.net/kmguo/article/details/8779522
lucene3.6的src包,可以用于附加上去看相应的源代码
本文档详细介绍了lucene3.6中的索引,以及每个部分对应于硬盘下的文件夹里的哪个文件。这个根据本人多年学术及编程经验总结的
超全的lucene3.6学习记录,实现了3中不同方法的检索,而且都很简单,容易上手,附带工程原文件
lucene3.6入门实例教程 完整代码示例,lucene入门学习很好的资料
基于Lucene3.6进行全文检索的开发
lucene3.6+IKAnalyzer2012FF_u1,配套的JAR包,google code关了好不容易才下载回来的
基于lucene平台搜索工具相关包及使用说明.rar
lucene官方网站上的lucene3.6源码,很不错的学习资料。
基本可以满足 检索电脑内文件的需求了 已经封装过了 直接指定检索目录和索引目录来创建索引.提供给学习者门参考... 直接通过调用静态方法来实现 深度分页检索.
lucene-3.6.1源代码及jar包,需要的可以直接下载~~~~~~~
NULL 博文链接:https://never-forget.iteye.com/blog/1282200