青菜猫(孙宇博客),青菜猫(孙宇博客),青菜猫(孙宇博客)http://www.javasdc.cn/
posts - 29,  comments - 63,  trackbacks - 0

我用的是lucene2.2.0,

最近要做一个站内的全文检索功能,下面把实现的代码贴出来,实现了索引的创建、检索和删除功能,并可以从检索结果去查询数据库~ .我主要是我系统的700W数据进行检索.下面主要是供应信息做为例子,(如有问题,多多评论,虚心接受).

 // 创建索引

IndexWriter writer;
   String indexDir = "d:""index/sellindex";
   boolean indexExist = indexExist(indexDir);
   if (indexExist) {
    writer = new IndexWriter(indexDir, new StandardAnalyzer(),
      false);
   } else {

    writer = new IndexWriter(indexDir, new StandardAnalyzer(), true);
   }
re为数据记录集,这里就不介绍了.
while (re.next()) {
//Field.Store.YES表示是不是被保存,
//Field.Index.no表示是不是被索引.
doc.add(new Field("vcsid", re.getString("vcsid"),
      Field.Store.YES, Field.Index.no));
//vcareacode是我的地区编号,因为我搜索要作为条件搜索.
 doc.add(new Field("vcareacode", re.getString("vcareacode"),
       Field.Store.YES, Field.Index.TOKENIZED));
//这里isort后面排序用的
doc.add(new Field("isort", re.getString("isort"),
       Field.Store.YES, Field.Index.TOKENIZED));
//clcontent是我的内容,因为我搜索要作为条件搜索.
doc.add(new Field("clcontent", re.getString("clcontent"),
       Field.Store.YES, Field.Index.TOKENIZED));
writer.addDocument(doc);
}
如果记录较多时,就循环添加
最后
writer.close();
判断索引存在方法
public static boolean indexExist(String indexDir) {
  return IndexReader.indexExists(indexDir);
 }
这样就在索引就建好了.

 // 索引搜索的实现(我这里已搜索内容和地区)

 IndexSearcher indexSearcher;
ndexSearcher = new IndexSearcher("d:""index/sellindex");
   Document doc = null;
   org.apache.lucene.search.BooleanQuery  bquery=new org.apache.lucene.search.BooleanQuery();
//我这里clcontent作为关键字来搜索
   QueryParser qa=new QueryParser("clcontent",new StandardAnalyzer());
   Query query=qa.parse(keyword);
//这里指定条件都满足搜索
   bquery.add(query,org.apache.lucene.search.BooleanClause.Occur.MUST);
//   vcareacode作为条件来查询,如果为NULL和 AA时表示查找所有的
   if(request.getParameter("vcareacode")!=null){
    if(!request.getParameter("vcareacode").toString().equals("aa")){      
       qa=new QueryParser("vcareacode",new StandardAnalyzer());
      query=qa.parse(request.getParameter("vcareacode")+"*");
      bquery.add(query,org.apache.lucene.search.BooleanClause.Occur.MUST);
      vcareacode=request.getParameter("vcareacode");
     }
  }"
//这里加的是高亮结果显示
 Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter("<font color=red><B>","</B></font>"),new QueryScorer(bquery));
    highlighter.setTextFragmenter(new SimpleFragmenter(80));
 org.apache.lucene.document.Document dc=null;
 Hits hits = indexSearcher.search(bquery,new Sort(new SortField("isort",true)));
  org.apache.lucene.analysis.standard.StandardAnalyzer analyzer = new org.apache.lucene.analysis.standard.StandardAnalyzer();
//这里hits.length()可以得到有多少记录.,I表示第几条记录
 dc = hits .doc(i);
//高亮显示类容
  org.apache.lucene.analysis.TokenStream  tokenStream = analyzer.tokenStream("clcontent", new java.io.StringReader(dc.get("clcontent")));
System.out.pritf(highlighter.getBestFragment(tokenStream,li.doc(i).get("clcontent")))  ;
dc.get("vcareacode")显示类别
这样就可以从建索引,到搜索.(有问题,发表下评论,我会回的)这只是简单的,我也在苦研中,要睡了,还要上班,有时间会写下更新索引,增加,删除,修改,还有一些优化方法..
                                                                                                                                                                               青菜猫(孙宇)

posted on 2007-10-22 23:33 青菜猫(孙宇) 阅读(1403) 评论(11)  编辑  收藏 所属分类: 搜索


FeedBack:
# re: 青菜猫lucene2.2.0全文检索
2007-10-25 08:53 | 阿蜜果
lucene我列入学习计划已经很久,但一直没有开始动手学习,关注你的这个系列  回复  更多评论
  
# re: 青菜猫lucene2.2.0全文检索
2007-10-25 09:04 | sundc
阿蜜果姐姐都来了....呵呵...  回复  更多评论
  
# re: 青菜猫lucene2.2.0全文检索
2007-10-25 14:16 | 五街
写的很好啊,你是杭州的吗
看到你的代码,跟我们公司在用的好像  回复  更多评论
  
# re: 青菜猫lucene2.2.0全文检索[未登录]
2007-11-01 11:50 | lk
不错  回复  更多评论
  
# re: 青菜猫lucene2.2.0全文检索
2007-11-02 15:33 | why
为什么高亮显示的时候看不到效果,:
比如我找"人生".出现如下:

<font color="red"><b>人</b></font><font color="red"><b>生</b></font>自古谁无死,留取丹心照汗青

我在JSP中显示的也是和这个一样的.没有看到有红色加粗的效果,这是为什么,能
把原因发到我邮箱吗. jiangguoyu2006@163.com 不胜感激  回复  更多评论
  
# re: 青菜猫lucene2.2.0全文检索
2007-11-03 16:04 | sundc
@why
在显示的时候你CODE加了org.apache.lucene.analysis.standard.StandardAnalyzer analyzer = new org.apache.lucene.analysis.standard.StandardAnalyzer();
org.apache.lucene.analysis.TokenStream tokenStream = analyzer.tokenStream("你的字段", new java.io.StringReader(dc.get("你的字段")));
highlighter.getBestFragment(tokenStream,li.doc(i).get("你的字段"))  回复  更多评论
  
# re: 青菜猫lucene2.2.0全文检索
2008-07-15 15:15 | 小雨转晴
青菜猫 谢谢你的回帖 我在思考....  回复  更多评论
  
# re: 青菜猫lucene2.2.0全文检索
2008-07-16 14:51 | 小雨转晴
小猫
你写的优化我看到啊,再有你循环添加的时候没有碰到内存溢出的问题嘛!急待解决!  回复  更多评论
  
# re: 青菜猫lucene2.2.0全文检索
2008-07-16 14:51 | 小雨转晴
是没看到 落个字  回复  更多评论
  
# re: 青菜猫lucene2.2.0全文检索
2008-07-17 08:54 | 青菜猫
@小雨转晴
我没有碰到过,最好在建索引的时候,各更新的时间把内存设置大一点...  回复  更多评论
  
# re: 青菜猫lucene2.2.0全文检索
2008-12-26 16:05 | wide
关键字:lucene.net 搜索排序 内存猛涨 内存溢出 IndexSearcher TopDocs weight

public IndexSearcher(String path) throws IOException ...{
this(IndexReader.open(path), true);
}

public IndexSearcher(Directory directory) throws IOException ...{
this(IndexReader.open(directory), true);
}

public IndexSearcher(IndexReader r) ...{
this(r, false);
}

private IndexSearcher(IndexReader r, boolean closeReader) ...{
reader = r;
this.closeReader = closeReader;
}

在lucene应用中也许很多人都遇到这种情况。当索引太大(大于10G),搜索时用前两种构造方法声明IndexSearcher

对象,这样每构造一个IndexSearcher对象,都要声明一个索引对象(实际上是一个索引的多次连接),而每个索引对

象都要占用一定量的系统资源(主要是内存)。当大量用户访问系统时,就会看到系统内存直线增长,致使产生

“java heap space”内存耗尽或内存溢出(.net)。这个问题可以通过以下方法解决:

终极解决方法:
联系方式: jackbison@163.com , pc2004lcq@126.com  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

青菜猫(孙宇)结交天下朋友,在网上吸取知识..

常用链接

留言簿(16)

随笔分类

随笔档案

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜

青菜猫(孙宇博客),青菜猫(孙宇博客),青菜猫(孙宇博客)http://www.javasdc.cn/