cmd
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
统计
随笔 - 13
文章 - 44
评论 - 9
引用 - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔档案
2006年10月 (1)
2006年8月 (2)
2006年6月 (1)
2006年4月 (3)
2006年3月 (3)
2006年2月 (3)
文章分类
j2ee基础(8)
(rss)
server(5)
(rss)
开源软件(28)
(rss)
文章档案
2006年6月 (1)
2006年4月 (9)
2006年3月 (9)
2006年2月 (11)
2005年12月 (1)
2005年11月 (2)
2005年6月 (3)
2005年1月 (1)
2004年12月 (7)
收藏夹
java技术(1)
(rss)
其他blog
(rss)
品味人生
(rss)
点点滴滴
(rss)
other
搞笑
优秀blog
临海观潮
(rss)
扬子江
ww
优秀官方
AppFuse
equinox(春秋分)
tapestry wiki
搜索
最新评论
1. re: Jetty 源码分析[未登录]
楼主有做Jetty 虚拟主机经验吗?
--Super
2. re: SVN使用技巧
无图.................................
--cyt
3. Unikal'Nyi Kontent
评论内容较长,点击标题查看
--Unikal'Nyi Kontent
4. re: 在Spring中集成Hibernate事务
抄来抄去的,没有意思
--11
5. re: J2EE 中的安全
Very good, thank you.
--cqusoft
阅读排行榜
1. SVN使用技巧(6209)
2. ejb3 学习第一篇 annotation(1745)
3. 看到这个帖子和对ajax感兴趣的网友,谢谢!往http://ajaxcn.org/forum/forums/list.page注册个帐号,交流一下,共同迎接web2.0(1085)
4. 利用XMLBean轻轻松松读写XML(转)(958)
5. 液晶面板小知识(368)
评论排行榜
1. SVN使用技巧(2)
2. 利用XMLBean轻轻松松读写XML(转)(2)
3. 看到这个帖子和对ajax感兴趣的网友,谢谢!往http://ajaxcn.org/forum/forums/list.page注册个帐号,交流一下,共同迎接web2.0(1)
4. ejb3 学习第一篇 annotation(0)
5. Spring让Hibernate使用者受益良多(0)
Lucene基本使用介绍
一. 概述
随着系统信息的越来越多,怎么样从这些信息海洋中捞起自己想要的那一根针就变得非常重要了,全文检索是通常用于解决此类问题的方案,而Lucene则为实现全文检索的工具,任何应用都可通过嵌入它来实现全文检索。
二. 环境搭建
从lucene.apache.org上下载最新版本的lucene.jar,将此jar作为项目的build path,那么在项目中就可以直接使用lucene了。
三. 使用说明
3.1. 基本概念
这里介绍的主要为在使用中经常碰到一些概念,以大家都比较熟悉的数据库来进行类比的讲解,使用Lucene进行全文检索的过程有点类似数据库的这个过程, table---à查询相应的字段或查询条件----à返回相应的记录,首先是IndexWriter,通过它建立相应的索引表,相当于数据库中的 table,在构建此索引表时需指定的为该索引表采用何种方式进行构建,也就是说对于其中的记录的字段以什么方式来进行格式的划分,这个在Lucene中 称为Analyzer,Lucene提供了几种环境下使用的Analyzer:SimpleAnalyzer、StandardAnalyzer、 GermanAnalyzer等,其中StandardAnalyzer是经常使用的,因为它提供了对于中文的支持,在表建好后我们就需要往里面插入用于 索引的记录,在Lucene中这个称为Document,有点类似数据库中table的一行记录,记录中的字段的添加方法,在Lucene中称为 Field,这个和数据库中基本一样,对于Field Lucene分为可被索引的,可切分的,不可被切分的,不可被索引的几种组合类型,通过这几个元素基本上就可以建立起索引了。在查询时经常碰到的为另外几 个概念,首先是Query,Lucene提供了几种经常可以用到的Query:TermQuery、MultiTermQuery、 BooleanQuery、WildcardQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、 FuzzyQuery、RangeQuery、SpanQuery,Query其实也就是指对于需要查询的字段采用什么样的方式进行查询,如模糊查询、语 义查询、短语查询、范围查询、组合查询等,还有就是QueryParser,QueryParser可用于创建不同的Query,还有一个 MultiFieldQueryParser支持对于多个字段进行同一关键字的查询,IndexSearcher概念指的为需要对何目录下的索引文件进行 何种方式的分析的查询,有点象对数据库的哪种索引表进行查询并按一定方式进行记录中字段的分解查询的概念,通过IndexSearcher以及Query 即可查询出需要的结果,Lucene返回的为Hits.通过遍历Hits可获取返回的结果的Document,通过Document则可获取Field中 的相关信息了。
通过对于上面在建立索引和全文检索的基本概念的介绍希望能让你对Lucene建立一定的了解。
3.2. 全文检索需求的实现
索引建立部分的代码:
private void createIndex(String indexFilePath) throws Exception{
IndexWriter iwriter=getWriter(indexFilePath);
Document doc=new Document();
doc.add(Field.Keyword("name","jerry"));
doc.add(Field.Text("sender","bluedavy@gmail.com"));
doc.add(Field.Text("receiver","google@gmail.com"));
doc.add(Field.Text("title","用于索引的标题"));
doc.add(Field.UnIndexed("content","不建立索引的内容"));
Document doc2=new Document();
doc2.add(Field.Keyword("name","jerry.lin"));
doc2.add(Field.Text("sender","bluedavy@hotmail.com"));
doc2.add(Field.Text("receiver","msn@hotmail.com"));
doc2.add(Field.Text("title","用于索引的第二个标题"));
doc2.add(Field.Text("content","建立索引的内容"));
iwriter.addDocument(doc);
iwriter.addDocument(doc2);
iwriter.optimize();
iwriter.close();
}
private IndexWriter getWriter(String indexFilePath) throws Exception{
boolean append=true;
File file=new File(indexFilePath+File.separator+"segments");
if(file.exists())
append=false;
return new IndexWriter(indexFilePath,analyzer,append);
}
3.2.1. 对于某字段的关键字的模糊查询
Query query=new WildcardQuery(new Term("sender","*davy*"));
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
3.2.2. 对于某字段的关键字的语义查询
Query query=QueryParser.parse("索引","title",analyzer);
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
3.2.3. 对于多字段的关键字的查询
Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
3.2.4. 复合查询(多种查询条件的综合查询)
Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);
Query mquery=new WildcardQuery(new Term("sender","bluedavy*"));
TermQuery tquery=new TermQuery(new Term("name","jerry"));
BooleanQuery bquery=new BooleanQuery();
bquery.add(query,true,false);
bquery.add(mquery,true,false);
bquery.add(tquery,true,false);
Searcher searcher=new IndexSearcher(indexFilePath);
Hits hits=searcher.search(bquery);
for (int i = 0; i < hits.length(); i++) {
System.out.println(hits.doc(i).get("name"));
}
四. 总结
相信大家通过上面的说明能知道Lucene的一个基本的使用方法,在全文检索时建议大家先采用语义时的搜索,先搜索出有意义的内容,之后再进行模糊之类的 搜索,^_^,这个还是需要根据搜索的需求才能定了,Lucene还提供了很多其他更好用的方法,这个就等待大家在使用的过程中自己去进一步的摸索了,比 如对于Lucene本身提供的Query的更熟练的掌握,对于Filter、Sorter的使用,自己扩展实现Analyzer,自己实现Query等 等,甚至可以去了解一些关于搜索引擎的技术(切词、索引排序 etc)等等。
posted on 2006-04-23 22:31
静夜思
阅读(185)
评论(0)
编辑
收藏
所属分类:
开源软件
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
Hibernate中的事务控制和并发
Lucene基本使用介绍
Mysql 内部函数的使用
apache正在孵化一个优良血统的web framework---shale
有空关注一个国人ajax产品
一个用于J2EE应用程序的Backbase Ajax前端
OSWorkflow 概念
hibernate二级缓存攻略
一个用于J2EE应用程序的Backbase Ajax前端
FreeMarker设计指南
Powered by:
BlogJava
Copyright © 静夜思