Lucene,这是官方称谓,也有许多人叫它Lucence,做搜索和分词用的工具包.也有人说是Java下的搜索引擎框架库,见仁见智的说法罢了.不管叫什么,确实非常有用,比如做全站的搜索,其实它的用处远大于此,但凡涉及到文本搜索的地方就能用到它.我们就以做全站搜索为例,演示一下如何应用Lucene建立索引.
public void index(List<IArticle> list)
{
//IArticle接口提供getName(标题)和getContent(内容)
//list就是从数据库里查询出来的要建立索引的对象的列表
if(list != null && list.size() > 0)
{
try {
//标记是否重新建立索引,true为重新建立索引
boolean flag = true;
//如果已存在索引,则追加索引
if(IndexReader.indexExists(path))
{
flag = false;
}
ChineseAnalyzer ca = new ChineseAnalyzer();
IndexWriter indexWriter = new IndexWriter("c:/lucene/index",ca,flag);
Document doc = null;
for(int i=0;i<list.size();i++)
{
doc = new Document();
doc.add(new Field("title",article.getName(),Field.Store.YES,Field.Index.TOKENIZED));
//添加内容属性,内容只索引,不存储
doc.add(new Field("content",new StringReader(list.get(i).getContent())));
indexWriter.addDocument(doc);
}
//优化并关闭
indexWriter.optimize();
indexWriter.close();
} catch (Exception e)
{
// TODO 自动生成 catch 块
//e.printStackTrace();
}
}
}
简单说下需要注意的地方:
1.ChineseAnalyzer ca = new ChineseAnalyzer();这个是分析器,Lucene内置多个,处理中文搜索我会用ChineseAnalyzer.
2.IndexWriter indexWriter = new IndexWriter(c:/lucene/index,ca,true);处理索引的类,注意其构造方法里的最后一个参数,如果为true则表示,下次建立索引时会清除这次建立的索引重新建立索引,如果为false则表示追加索引,在原来索引的基础上追加.看实际情况定true或false.
3.doc.add(new Field("title",article.getName(),Field.Store.YES,Field.Index.TOKENIZED));这一句表示为文章标题建立索引并存储.
4.doc.add(new Field("content",new StringReader(list.get(i).getContent())));这句是为内容建立索引但不存储
这样我们就为文章对象建立好索引了,然后就可以利用Lucene的其他类对这个索引目录进行搜索了,关于搜索部分我们稍后再补充上.
下面是搜索部分的代码,写的简陋了点,比较简单,不再多说,请参看注释:
public class Search
{
//定义一个索引搜索类对象
private IndexSearcher searcher = null;
//定义一个Query对象
private Query query = null;
//定义中文分析器
ChineseAnalyzer analyzer = new ChineseAnalyzer();
//构造方法里完成searcher的实例化
public Search()
{
try
{
//这里的参数就是上面我们生成索引的目录
searcher = new IndexSearcher(IndexReader.open("c:/lucene/index"));
}catch(Exception e)
{
e.printStackTrace();
}
}
public Hits search(String keyword) throws Exception
{
//开始搜索的时间
Date start = new Date();
//对我们索引的content字段进行搜索
QueryParser qp = new QueryParser("content",analyzer);
this.query = qp.parse(keyword);
Hits hits = this.searcher.search(query);
Date end = new Date();
System.out.println("检索完成,用时"+(end.getTime()-start.getTime())+"毫秒");
//////////打印测试////////
if(hits != null && hits.length() > 0)
{
for(int i = 0; i < hits.length(); i++)
{
try
{
Document doc = hits.doc(i);
System.out.println("结果"+(i+1)+":"+doc.get("title")+" createTime:"+doc.get("content"));
//System.out.println(doc.get("path"));
}catch(Exception e)
{
e.printStackTrace();
}
}
}
return hits;
}
///调用,主方法
public static void main(String[] args)
{
try
{
Search test = new Search();
Hits h = test.search("你好");
} catch (Exception e)
{
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
分享到:
- 2007-09-20 11:09
- 浏览 4836
- 评论(1)
- 论坛回复 / 浏览 (0 / 12114)
- 查看更多
相关推荐
lucene
lucene 对 xml建立索引 建立索引就是怎么简单 呵呵
Lucene之删除索引 Lucene之删除索引 Lucene之删除索引 http://blog.csdn.net/nupt123456789/article/details/10666105
利用Lucene.net做的建立索引,检索分页
Lucene创建索引,查询索引的简单使用。
lucene建立数据库索引的问题,在这里,把其中的一些问题补充说明,希望对大家有新的帮助,希望大家相互提出问题,相互学习,共同进步!!
Lucene3.0创建索引 读取目录下的所有txt文档格式的文件,然后生成一个索引文件到某目录下!
基于lucene技术的增量索引,实现索引的首次创建,动态增删改
本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索 【该源码由51aspx提供】 源码 " onerror="this.src='/images/ifnoimg.gif'" src="/uploads/allimg/090904/1039152O5-0.jpg...
Lucene 删除 合并索引,可以指定几个索引文件合并成一个索引文件。自己写的,有很多不足之处请多指教
Lucene结合Sql建立索引Demo源码 Lucene(这里用到的是Lucene.net版本也成为DotLucene)是一个信息检索的函数库(Library),利用它你可以为你的应用加上索引和搜索的功能. Lucene的使用者不需要深入了解有关全文检索的...
Lucene(这里用到的是Lucene.net版本也成为DotLucene)是一个...本源码演示了Lucene结合Sql建立索引,把Sql中的数据通过建立索引用Lucene来检索 支持简单的中文分词,同时提供了Lucene.Net-2.0-004版本的源码给大家
最简单的Lucene建立、搜索索引的方法,工程基于Myeclipse10
用lucene对数据库建立索引及搜索.doc
基于lucene 2.4简单的一个索引和搜索实例
Lucene索引建立的过程,类似于将数据进行关键字提取,设置标签,在后续工作中,可以通过这个标签进行内容过滤获取期望数据的操作。
根据博客调试的程序,比较简单,英文分词和检索,希望对大家学习有帮助。
Lucene建立索引jar包和Paoding庖丁分词jar包,Lucene结合Paoding庖丁分词创建索引索引jar包汇总