`
junjie314
  • 浏览: 60278 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

使用Lucene进行全文检索(三)---进行搜索(转载)

 
阅读更多

转载:http://www.jscud.com/srun/news/viewhtml/3_2005_8/78.htm

 

关键字:lucene,html parser,全文检索,indexreader,document,field,indexwriter,term,htmlpage


 无论是建立索引还是分析内容,都是为了用户的搜索服务.
 
 在lucene中,如果需要使用搜索,需要使用searcher类,这是一个抽象类,它有2个子类:indexsearcher和multisearcher.
 
 indexsearcher是对一个索引进行搜索,如果你需要对多个索引进行搜索,可以使用multisearcher.下面的内容只介绍了indexsearcher.
 
 搜索涉及到几个问题:分页,组合条件,根据条件过滤,排序等等.
 
 分页:分页在记录列表的地方都会遇到,这里不在赘述,我也实现过一个保存分页结果和显示结果的类,用于自己的实际工作,下面也会用到保存分页结果的类,代码如下:

  package com.jscud.support;
  
  
  /**
   * 分页显示用的参数.
   * 
   * 
   */
  
  public class divpageinfo
  {
  
      //开始记录数
      private int recstart;
  
      //结束记录数
      private int recend;
  
      //总页数
      private int pagecount;
  
      //当前页
      private int page;
  
      //记录总数
      private int reccount;
     
      //每页记录数
      private int perpagerows;
  
      public int getnicepagecount()
      {
          return getnicepagenum(pagecount);
      }
     
      //get,set等,不在列出
      //......
  
     
      /**
       * 得到友好的页数数字,页数为0时,返回1.
       *
       * @return 得到友好的页数
       */
      public static int getnicepagenum(int npage)
      {
              if (npage == 0)
              {
                      return 1;
              }
              else
              {
                      return npage;
              }
      }   
  } 

 显示分页结果的类就需要大家根据自己使用的框架来具体实现了.我使用的是webwork.
 
 组合条件:在lucene中,搜索的条件可以组合的很复杂,相关的类有booleanquery, filteredquery, multitermquery, phraseprefixquery, phrasequery, prefixquery, rangequery, spanquery, termquery 等等,从而可以组合出很复杂的条件用于查询.
 另外queryparser可以根据用户输入的字符串和设定的解析器和字段设置等,可以自动产生新的组合条件用于查询,例如用户输入"john and black",queryparser可以自己分析出用户是需要查询字段中同时包含"john"和"black"的结果.
 
 过滤条件:有时候根据具体的用户需求,有些记录对于一些用户是不可见的,此时就要使用过滤器来防止不合法的用户看到不应该看到的记录.过滤器同时也可以根据一些具体的条件来过滤掉一些用户不想看到的记录.如果需要实现自己的filter,只要参考queryfilter,datefilter实现filter即可.
 
 排序:有时候,可能需要根据某个字段进行排序,例如按照时间排序.当然更多的时候是按照搜索结果的符合度进行排序,lucene默认的排序就是按照符合度来进行排序的.
 
 进行搜索的代码如下,根据自己的需要进行代码的修改:
 

 /**
 * 进行搜索.
 *
 * 参数依次为:搜索内容(支持lucene语法),当前页,每页记录数,分页信息对象
 *
 */
    public static list search(string searchtext, int page, int perpage, final divpageinfo pageinfo)
    {
        list docs = new arraylist();
       
        if(!lucenesearch.indexexist(indexdir)) { return docs; }

        searcher searcher = null;
        try
        {
            standardanalyzer analyzer = new standardanalyzer();

            //处理检索条件
            query titlequery = queryparser.parse(searchtext, "title", analyzer);
            query contextquery = queryparser.parse(searchtext, "content", analyzer);
            query otherquery = queryparser.parse(searchtext, "other", analyzer);

            booleanquery query = new booleanquery();
            query.add(titlequery, false, false);
            query.add(contextquery, false, false);
            query.add(otherquery, false, false);

            //分页检索
            searcher = new indexsearcher(indexdir);
            hits hits = searcher.search(query);

            divpageinfo.divpage(hits.length(), perpage, page, pageinfo);

            //取出当前页的记录
            for (int i = pageinfo.getrecstart(); i <= pageinfo.getrecend(); i++)
            {
                docs.add(lucenedocument.getdocument(hits.doc(i - 1)));
            }
        }
        catch (ioexception e)
        {
            logman.error("error occur when search lucene", e);
        }
        catch (parseexception e)
        {
            logman.error("error occur when search lucene", e);
        }
        finally
        {
            try
            {
                if (null != searcher)
                {
                    searcher.close();
                }
            }
            catch (ioexception e)
            {
                logman.warn("close searcher error");
            }
        }

        return docs;
    }



 
 代码中出现了一个新的类hits,hits是lucene的搜索结果集,是lazy load的结果集,只有你真正访问它,它才去装载真正的数据.
 
 代码中还出现了一个lucenedocument,这是为了在页面中显示而写的一个辅助类,因为lucene的document是final的,无法进行扩展,而要显示时间字段必须要调用datefield中的函数,这样在页面中显示就不太直观了,所以写了这个辅助类,代码如下:
 

  package com.jscud.www.support.search;
  
  import java.sql.timestamp;
  import java.util.date;
  
  import org.apache.lucene.document.datefield;
  import org.apache.lucene.document.document;
  import org.apache.lucene.document.field;
  
  /**
   * 对lucene的document的封装,用于显示目的.
   *
   * @author scud(飞云小侠) http://www.jscud.com
   *
   */
  public class lucenedocument
  {
      private document doc;
     
      public lucenedocument(document doc)
      {
          this.doc = doc;
      }
     
      public static lucenedocument getdocument(document doc)
      {
          return new lucenedocument(doc);
      }
     
      public string getvalue(string name)
      {
          return doc.get(name);
      }
     
      public field getfield(string name)
      {
          return doc.getfield(name);
      }
     
      public timestamp getdatetime(string name)
      {
          string value = doc.get(name);
          return new timestamp( datefield.stringtotime(value));
      }
     
      public date getdate(string name)
      {
          string value = doc.get(name);
          return  datefield.stringtodate(value);       
      }    
  }


 
 使用webwork对结果集进行了显示,代码如下:

          <ww:iterator value="docs">
          </ww:iterator>

          "  target="_blank" >
          <ww:property value="getvalue(title)" escape="true"></ww:property>
         
  (<jscud:datetime value="getdatetime(addtime)"></jscud:datetime>)
         



 然后调用分页信息显示tag即可.
 
 
 通过以上的应用,可以看到,其实使用lucene很简单,以前总觉得很神秘,所以一直没有使用过,用过之后才觉得如此简单.
 
 
 当然,对于大容量数据下,群集情况下,在网上都有很多解决方案,在此不一一提出,感兴趣的读者可以自己去搜索. :)

分享到:
评论

相关推荐

    lucene-analyzers-smartcn-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-analyzers-smartcn-7.7.0.jar; 赠送原API文档:lucene-analyzers-smartcn-7.7.0-javadoc.jar; 赠送源代码:lucene-analyzers-smartcn-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-...

    最新全文检索 lucene-5.2.1 入门经典实例

    《最新全文检索 Lucene-5.2.1 入门经典实例》 Lucene是一个开源的全文检索库,由Apache软件基金...通过学习和实践这些经典实例,开发者能够掌握如何利用Lucene构建高效的全文检索系统,提升数据的可搜寻性和用户体验。

    lucene-analyzers-common-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-analyzers-common-6.6.0.jar; 赠送原API文档:lucene-analyzers-common-6.6.0-javadoc.jar; 赠送源代码:lucene-analyzers-common-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-...

    lucene-core-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...

    lucene-backward-codecs-7.3.1-API文档-中英对照版.zip

    赠送jar包:lucene-backward-codecs-7.3.1.jar; 赠送原API文档:lucene-backward-codecs-7.3.1-javadoc.jar; 赠送源代码:lucene-backward-codecs-7.3.1-sources.jar; 赠送Maven依赖信息文件:lucene-backward-...

    lucene-spatial-extras-6.6.0-API文档-中英对照版.zip

    赠送jar包:lucene-spatial-extras-6.6.0.jar; 赠送原API文档:lucene-spatial-extras-6.6.0-javadoc.jar; 赠送源代码:lucene-spatial-extras-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-spatial-extras...

    lucene-spatial-extras-7.3.1-API文档-中英对照版.zip

    赠送jar包:lucene-spatial-extras-7.3.1.jar; 赠送原API文档:lucene-spatial-extras-7.3.1-javadoc.jar; 赠送源代码:lucene-spatial-extras-7.3.1-sources.jar; 赠送Maven依赖信息文件:lucene-spatial-extras...

    lucene-backward-codecs-6.6.0-API文档-中英对照版.zip

    赠送jar包:lucene-backward-codecs-6.6.0.jar; 赠送原API文档:lucene-backward-codecs-6.6.0-javadoc.jar; 赠送源代码:lucene-backward-codecs-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-backward-...

    lucene-analyzers-smartcn-7.7.0-API文档-中英对照版.zip

    赠送jar包:lucene-analyzers-smartcn-7.7.0.jar; 赠送原API文档:lucene-analyzers-smartcn-7.7.0-javadoc.jar; 赠送源代码:lucene-analyzers-smartcn-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-...

    lucene-spatial-extras-7.2.1-API文档-中英对照版.zip

    赠送jar包:lucene-spatial-extras-7.2.1.jar; 赠送原API文档:lucene-spatial-extras-7.2.1-javadoc.jar; 赠送源代码:lucene-spatial-extras-7.2.1-sources.jar; 赠送Maven依赖信息文件:lucene-spatial-extras...

    lucene-backward-codecs-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-backward-codecs-6.6.0.jar; 赠送原API文档:lucene-backward-codecs-6.6.0-javadoc.jar; 赠送源代码:lucene-backward-codecs-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-backward-...

    lucene-backward-codecs-7.2.1-API文档-中英对照版.zip

    赠送jar包:lucene-backward-codecs-7.2.1.jar; 赠送原API文档:lucene-backward-codecs-7.2.1-javadoc.jar; 赠送源代码:lucene-backward-codecs-7.2.1-sources.jar; 赠送Maven依赖信息文件:lucene-backward-...

    lucene-suggest-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-suggest-6.6.0.jar; 赠送原API文档:lucene-suggest-6.6.0-javadoc.jar; 赠送源代码:lucene-suggest-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-suggest-6.6.0.pom; 包含翻译后的API...

    Lucene4 全文检索

    作为一个高级的搜索引擎工具包,Lucene4 提供了完整的索引和搜索机制,使得在文件和数据库中进行全文检索变得简单高效。在本文中,我们将深入探讨 Lucene4 的核心概念、工作流程以及如何在实际项目中应用。 ### 1. ...

    lucene-core-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-core-6.6.0.jar; 赠送原API文档:lucene-core-6.6.0-javadoc.jar; 赠送源代码:lucene-core-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-6.6.0.pom; 包含翻译后的API文档:lucene...

    lucene-core-7.2.1-API文档-中文版.zip

    赠送jar包:lucene-core-7.2.1.jar; 赠送原API文档:lucene-core-7.2.1-javadoc.jar; 赠送源代码:lucene-core-7.2.1-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.2.1.pom; 包含翻译后的API文档:lucene...

    lucene-highlighter-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-highlighter-6.6.0.jar; 赠送原API文档:lucene-highlighter-6.6.0-javadoc.jar; 赠送源代码:lucene-highlighter-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-highlighter-6.6.0.pom;...

    使用Lucene对doc、docx、pdf、txt文档进行全文检索功能的实现 - 干勾鱼的CSDN博客 - CSDN博客1

    在本文中,我们将探讨如何使用Lucene对这些文件类型进行全文检索的实现。 首先,为了实现全文检索,我们需要创建索引。在Lucene中,`IndexWriter` 类是负责创建和更新索引的主要工具。在`LuceneCreateIndex` 类中,...

    使用zend Framework的lucene进行全文检索

    在本文中,我们将探讨如何使用Zend Framework的Lucene模块进行全文检索,特别是针对中文分词的处理。全文检索是提高网站或应用搜索功能的关键技术,它允许用户输入任意词汇,系统能够快速找到与之相关的内容。Zend ...

    lucene-core-6.6.0-API文档-中英对照版.zip

    赠送jar包:lucene-core-6.6.0.jar; 赠送原API文档:lucene-core-6.6.0-javadoc.jar; 赠送源代码:lucene-core-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-6.6.0.pom; 包含翻译后的API文档:lucene...

Global site tag (gtag.js) - Google Analytics