`

使用Lucene进行全文检索

阅读更多

Scud(飞云小侠) http://www.jscud.com 转载请注明来源/作者

关键字:lucene,html parser,全文检索,IndexReader,Document,Field,IndexWriter,Term,HTMLPAGE


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

  package com.jscud.support;
  
  
  /**
   * 分页显示用的参数.
   *
   * @author scud(飞云小侠) http://www.jscud.com
   * 
   */
  
  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中的函数,这样在页面中显示就不太直观了,所以写了这个辅助类,代码如下:
 

=center border=0>
  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对结果集进行了显示,代码如下:

xml 代码
  1. <ww:iterator value="docs">  
  2.        <tr >             
  3.        <td>  
  4.        <a href="<jscud:contextpath /><ww:property  value="getValue('visiturl')" />arget="_blank" >  
  5.        <ww:property value="getValue('title')" escape="true" />  
  6.        </a> &nbsp; (<jscud:datetime value="getDateTime('addtime')" />)   
  7.        </td>  
  8.        </tr>  
  9.        </ww:iterator>    


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

分享到:
评论

相关推荐

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

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

    Lucene全文搜索_LuceneJava全文搜索_

    "DocSearch"可能是一个示例程序或库,展示了如何在Java项目中实际集成和使用Lucene进行文档搜索。 总之,Lucene作为Java全文搜索的基石,提供了强大的功能和灵活性,可以帮助开发者构建高效、精准的搜索功能,无论...

    Lucene4 全文检索

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

    Lucene全文检索案例

    这个案例将深入探讨如何使用Lucene进行全文检索,帮助你理解和应用其核心概念。 1. **安装与依赖** 首先,你需要在项目中引入Lucene的依赖。如果你使用的是Maven,可以在pom.xml文件中添加对应的Lucene依赖。目前...

    使用lucene全文检索数据库

    **使用Lucene全文检索数据库** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它是Java编写的,能够帮助开发者在各种应用程序中实现强大的全文检索功能。在这个项目中,我们将探讨如何利用Lucene ...

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

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

    基于lucene的全文检索系统

    **基于Lucene的全文检索系统** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个简单但功能强大的API,可以帮助开发者快速地在大量文档中实现高效的全文...

    lucene 全文检索数据库

    下面将详细阐述Lucene的基本概念、如何在Java环境中使用Lucene进行全文检索,以及结合MySQL数据库的具体实现案例。 ### Lucene简介 Lucene是一个高性能、全功能的文本搜索引擎库,由Doug Cutting创建并开源。它为...

    Lucene全文检索引擎

    3. **索引(Index)**:索引是Lucene的核心,它是对文档集合的结构化表示,使得能快速进行全文检索。Lucene通过分词(Tokenization)、词干提取(Stemming)、去除停用词(Stopword Removal)等过程将原始文本转换...

    Lucene 全文检索

    这篇博客文章(博文链接:https://tristan-s.iteye.com/blog/1033618)可能详细解释了如何使用Lucene进行全文检索,包括其核心概念、API使用和实际案例。由于描述信息为空,我们只能根据标题和标签来推测内容。文章...

    Lucene.Net 实现全文检索

    在本案例中,我们将在 .Net MVC4 框架上使用 Lucene.Net 来构建一个全文检索系统。 首先,我们需要理解全文检索的基本概念。全文检索是指在文档集合中,根据用户输入的查询词,查找包含这些词的文档。与传统的...

    lucene全文搜索ajax例子

    本示例主要涉及的是使用Lucene进行全文搜索,并结合Ajax技术实现动态更新的交互体验。Lucene是Apache软件基金会的一个开放源代码项目,它是一个高性能、可扩展的信息检索库,为开发者提供了强大的文本搜索功能。而...

    使用Lucene.net进行全文搜索

    本文将深入探讨如何使用Lucene.NET进行全文搜索,特别是针对多关键字匹配的场景。 首先,我们需要了解Lucene.NET的基本概念。Lucene是一个开源的文本搜索库,它的核心功能包括文档索引、搜索和排序。Lucene.NET是这...

    基于Lucene的全文检索引擎研究与应用.pdf

    ### 基于Lucene的全文检索引擎研究与应用 #### 概述 随着信息技术的飞速发展,尤其是互联网的普及,企业和个人积累了大量的电子文档。如何高效地管理和检索这些文档成为了亟待解决的问题。全文检索技术作为一种...

    基于Lucene的全文搜索引擎研究与应用.pdf

    【Lucene全文搜索引擎研究】 Lucene是一个开源的全文检索库,由Apache Jakarta项目维护,主要用Java编写。作为一款强大的全文索引引擎工具包,Lucene具有高速的访问速度,支持多用户并发访问,并且具备跨平台的特性...

    lucene全文检索需要jar包

    在使用Lucene进行全文检索时,有三个核心的Jar包是必不可少的,它们分别是: 1. **lucene-analyzers-3.6.1.jar** - 这个包主要包含了Lucene的分析器组件。在全文检索中,分析器是至关重要的,因为它负责将用户输入...

    基于Lucene的全文检索系统

    总结来说,基于Lucene的全文检索系统利用了Java和Swing技术,结合Lucene的索引和搜索能力,为本地文件提供了便捷的全文搜索服务。用户只需输入关键词,系统就能快速找到相关的文档,极大地提高了工作效率。通过深入...

    lucene全文检索简单索引和搜索实例

    《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...

    Lucene基于java的全文检索案例

    在 "luceneDemo" 压缩包中,你可能会找到以下部分示例代码和配置,用于演示如何使用 Lucene 进行全文检索: 1. **索引创建(Index Creation)**: 创建索引通常涉及读取源文件(如文本文件或数据库记录),解析内容...

Global site tag (gtag.js) - Google Analytics