lucene实际运用

原创 2007年10月08日 11:18:00

    刚结束了一个项目,回头想了下整个开发流程,决定再总结下缓存问题及lucene(全文检索)的运用。

    首先来谈下lucene

    项目的service端运用spring+hibernate开发。其间用到lucene做全文检索。版本为2.2,分词用的是JE-Analysis1.5.1.MMAnalyzer.建立索引用到队列。

   我们先在blogservice里初始化索引路径,其实现是在spring配置文件里设置:

 <bean id="blogService" class="cn.shell.service.BlogService"
  parent="baseService">
  
  <property name="indexPathRoot"
   value="${webapp.root}WEB-INF/index/blog/">
  </property>
  
</bean>

   项目中主要是要求提高性能,所以采用队列来创建索引。List  waitToIndexList=new LinkedList();

   创建索引部分:

   IndexWriter indexWriter;

   IndexSearcher indexSearcher;

   创建新线程:Thread indexThread=new Thread(this);

   实例分词:   MMAnalyzer analyzer=new MMAnalyzer();

   初始化部分:

  public void init(){

                              File rp = new File(indexPathRoot);
  if (!rp.exists()) {
   rp.mkdirs();
  }
  File segments = new File(indexPathRoot + File.separator
    + "segments.gen");
  boolean bCreate = true;
  if (segments.exists()) {
   bCreate = false;
  }
  try {
   
   indexWriter = new IndexWriter(indexPathRoot, analyzer, bCreate);
   indexSearcher = new IndexSearcher(indexPathRoot);
  } catch (Exception e) {
   logger.error("init indexWriter fail", e);
  }
  indexThread.start();                      //启动线程

}

public void run(){

while (!indexThread.isInterrupted()) {
   if (!waitToIndexList.isEmpty()) {
    Blog blog = (Blog) waitToIndexList.remove(0);
    Document doc = new Document();
    doc.add(new Field("blogID", blog.getBlogID(), Field.Store.YES,
      Field.Index.UN_TOKENIZED));
    doc.add(new Field("title", blog.getTitle(), Field.Store.YES,
      Field.Index.TOKENIZED));
    doc.add(new Field("content", blog.getContent(),
      Field.Store.YES, Field.Index.TOKENIZED));
    doc.add(new Field("author", blog.getClientUser().getNickName(),
      Field.Store.YES, Field.Index.TOKENIZED));

    try {
     indexWriter.addDocument(doc);
     indexWriter.flush();
     indexWriter.optimize();
    } catch (Exception e) {
     logger.error("create index error", e);
    }

   }

   try {
    Thread.sleep(50);
   } catch (Exception e) {
    logger.error(e);
   }

  }}

每创建一个新BLOG对象,我们将该对象塞到队列waitToIndexList中。

 public void addBlog(Blog blog) {

  AddBlogTask saveBlogTask = new AddBlogTask(blog, blogDAO);
  asyncService.doTask(saveBlogTask);
  // 更新缓存
  String k = "KEY_BLOG" + blog.getBlogID();
  cacheService.put(k, blog);

  this.waitToIndexList.add(blog);
 }

search部分:

public Hits searchBlogByLucene(String keyword){

//首先从缓存中取 看是否能取到。  

  Hits hits = (Hits) cacheService.get("BLOG_SEARCH_" + keyword);
    if (hits == null) {

    try {
    MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
      new String[] { "title", "content", "author" }, analyzer);
    Query query = queryParser.parse(keyword);
    hits = indexSearcher.search(query);

   } catch (Exception e) {
    logger.error("search " + keyword, e);
   }

  //缓存中没有的情况下 再将搜到的结果塞到缓存中。
   cacheService.put("BLOG_SEARCH_" + keyword, hits);
  }
  return hits;

}//享元(flyweight)模式

 

搜索结果部分:

  public List searchBlogs(String keyword, int off, int max) {

  Hits hits = searchBlogByLucene(keyword);
  String[] ids = new String[hits.length()];
  for (int i = 0; i < hits.length(); i++) {
   Document docTemp;
   try {
    docTemp = hits.doc(i);
    String blogID = docTemp.get("blogID");
    ids[i] = blogID;
   } catch (Exception e) {

    e.printStackTrace();
   }

  }
  List hitsList = blogDAO.getBlogsByBlogIDS(ids, off, max);

  return hitsList;
 }

搜索结果集大小:

 public int getSearchBlogsCount(String keyword) {
  Hits hits = searchBlogByLucene(keyword);
  if (hits != null) {
   return hits.length();
  } else {
   return 0;
  }
 }

 

   

Lucene学习笔记-内存与文件索引的简单操作

Lucene 内存索引、文件索引的一些简单操作
  • wulinshishen
  • wulinshishen
  • 2015-01-23 23:24:45
  • 1437

lucene部分常用代码

  • 2014年01月15日 17:46
  • 68KB
  • 下载

lucene打分公式

lucene利用余弦相似度进行计算,并进行了改进 coord(q,d):文档d匹配q的词越多,此值越大,在查询的时候计算的,匹配的词/查询的总词数(可能不一样) queryNorm(q):...
  • asd7010
  • asd7010
  • 2017-02-27 18:04:46
  • 151

第一个Lucene实例

运行lucene所需要的JAR包 lucene-core-3.6.0.jar(核心包) lucene-analyzers-3.6.0.jar(分词器) lucene-highlighter-3.6.0...
  • w_l_j
  • w_l_j
  • 2012-05-03 21:05:54
  • 11480

一个小小的ssm+lucene DEMO

  • 2017年09月08日 17:21
  • 21.45MB
  • 下载

在Eclipse中初用lucene

在Eclipse中初用lucene Posted on 2008-03-25 12:24 鲁胜迪 阅读(509) 评论(0)  编辑  收藏 lucene是apache的...
  • samxx8
  • samxx8
  • 2011-06-21 18:10:00
  • 1483

lucene在项目中真实使用

开源全文搜索工具包Lucene3.0.1的使用。 项目环境Struts2 (2.18)+Hibernate(3.0)+Spring(2.5) JDK:1.6 IDE:myEclipse 8.5 ...
  • yu870646595
  • yu870646595
  • 2016-05-10 17:38:13
  • 2262

Java搜索工具——Lucene实例总结(一)

参考网页:http://footman265.iteye.com/blog/849744     搞了一天半,终于利用lucene工具Demo完了我想要的功能,这其中包括为数据库建立增量索引、从索引...
  • u014386474
  • u014386474
  • 2016-06-08 16:41:15
  • 4914

Dubbo实际应用基本配置讲解

一、发展趋势随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。 单一应用架构当网站流量很小时,只需...
  • A632189007
  • A632189007
  • 2017-08-11 14:42:19
  • 338

GCD实际应用

GCD 先行概念 程序:是为了实现特定目标或解决特定问题而用计算机语言编程的命令序列集合。程序分为两种:系统程序与应用程序 进程:这里为了避免引入过多的概念造成误解与便于后续问题的展开就粗暴与错...
  • qq_18133317
  • qq_18133317
  • 2015-12-13 16:32:37
  • 336
收藏助手
不良信息举报
您举报文章:lucene实际运用
举报原因:
原因补充:

(最多只允许输入30个字)