`
devsky
  • 浏览: 26072 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于全文检索的文章(使用技术Lucene3.0)

阅读更多

Lucene3.0全文搜索简单应用

由于项目的要求,用到了全文搜索技术,上网查了许多资料,结合本项目实际情况,现将lucene3.0总结如下:

1.首先了解一下lucene中的一些基本概念:

 假设我们的电脑的目录中含有很多文本文档,我们需要查找哪些文档含有某个关键词。为了实现这种功能,我们首先利用 Lucene 对这个目录中的文档建立索引,然后在建立好的索引中搜索我们所要查找的文档。

 

(1)建立索引
为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory。下面我们分别介绍一下这五个类的用途:

Document

Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。

Field
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。

Analyzer

在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。

IndexWriter

IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。

Directory

这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。

熟悉了建立索引所需要的这些类后,我们开始对某个目录下面的htm文件l建立索引了,在建立的过程中,需将这些html文件转化为文本文件,下面给出建立索引类的源代码。


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.SimpleFSDirectory;
import org.htmlparser.Parser;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.HtmlPage;
import org.wltea.analyzer.lucene.IKAnalyzer;

 

public class LuceneIndex
{
 public static final String CONTENT_KEY_NAME = "content";//内容的键
 public static final String FILE_KEY_NAME = "filenamddde";//文件名的键
 public IndexWriter mWriter = null;//用于写入索引的对象

 /**
  * @功能描述 打开Lucene实例
  * @输入参数 indexDirectory为索引存放目录,create为创建索引
  * @反馈值 无
  */
 public void openLuceneIndex(Directory indexDirectory, boolean create) throws CorruptIndexException, LockObtainFailedException, IOException
 {
  close();
  mWriter = new IndexWriter(indexDirectory, new IKAnalyzer(), create, MaxFieldLength.LIMITED);
  mWriter.setUseCompoundFile(true);
 }

 /**
  * @功能描述 将HTML转化为Text
  * @输入参数
  * @反馈值
  */
 public static String extractHtml(String inputHtml) throws ParserException
 {
  Parser htmlParser = Parser.createParser(inputHtml,"utf-8");
  HtmlPage thePage = new HtmlPage(htmlParser);
  htmlParser.visitAllNodesWith(thePage);
  String body = thePage.getBody().asString();
  body = body.replaceAll("[ \\t\\n\\r\\f( |gt) ]+", " ");
  System.out.println(body);
  String title = thePage.getTitle();
  return title + " " + body;
 }

 /**
  * @throws Exception
  * @功能描述 向已经打开的Lucene实例里面添加新的索引
  * @输入参数
  * @反馈值
  */
 public void indexTxt(File f) throws Exception
 {
  if (mWriter == null)
  {
   throw new Exception("Lucene Index not Opened!");
  }
  BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), "GBK"));
  StringBuffer sb = new StringBuffer();
  String temp = null;
  while ((temp = reader.readLine()) != null)
  {
   sb.append(temp);
  }
  reader.close();
  indexString(f.getName(), sb.toString());
 }

 /**
  * @功能描述 索引HTML文件
  * @输入参数
  * @反馈值
  */
 public void indexHtml(File f) throws Exception
 {
  BufferedReader br = null;
  try
  {
   StringBuffer sb = new StringBuffer();
   br = new BufferedReader(new InputStreamReader(new FileInputStream(f),"utf-8"));

   String temp = null;
   while ((temp = br.readLine()) != null)
   {
    sb.append(temp + "\r\n");
   }

   String theHtml = sb.toString();
   String thePlainText = extractHtml(theHtml);

   indexString(f.getName(), thePlainText);
  } catch (Exception ex)
  {
   throw ex;
  } finally
  {
   if (br != null)
   {
    br.close();
   }
  }
 }

 /**
  * @功能描述  索引字符串
  * @输入参数 
  * @反馈值   
  */
 public void indexString(String key, String content) throws Exception
 {
  if (mWriter == null)
  {
   throw new Exception("Lucene Index not Opened!");
  }
 
  Document doc = new Document();
 
  doc.add(new Field(CONTENT_KEY_NAME, content, Field.Store.YES, Field.Index.ANALYZED));
  doc.add(new Field(FILE_KEY_NAME, key, Field.Store.YES, Field.Index.ANALYZED));
 
  mWriter.addDocument(doc);
  mWriter.optimize();
 }

 public void close()
 {
  try
  {
   if (mWriter != null)
   {
    mWriter.close();
    mWriter = null;
   }
  } catch (Exception e)
  {
  }
 }

 /**
  * @功能描述 建立索引
  * @输入参数 indexDirectory为索引存放路径,docDirectory为文档存放路径
  * @反馈值
  */
 public static void indexService(String indexDirectory, String docDirectory) throws Exception
 {
  LuceneIndex index = new LuceneIndex();
  Directory directory = null;
  try
  {
   directory = new SimpleFSDirectory(new File(indexDirectory));// new
   index.openLuceneIndex(directory, true);
   indexDirectory(index, new File(docDirectory));
   System.out.println("索引完成");
  } catch (Exception e)
  {
   throw e;
  } finally
  {
   index.close();
  }
 }

 /**
  * @功能描述 遍历索引一个目录下面的所有HTML文件
  * @输入参数
  * @反馈值
  */
 public static void indexDirectory(LuceneIndex index, File directory) throws Exception
 {
  File[] fileList = directory.listFiles();
  for (File f : fileList)
  {
   if (f.isFile())
   {
    if (f.getName().endsWith(".html") || f.getName().endsWith(".htm"))
    {
     System.out.println("现在开始索引:" + f.getName());
     index.indexHtml(f);
    }
   } else if (f.isDirectory())
   {
    indexDirectory(index, f);
   }
  }
 }
 
}

 

(2)搜索文档
利用 Lucene 进行搜索就像建立索引一样也是非常方便的。在上面一部分中,我们已经为一个目录下的文本文档建立好了索引,现在我们就要在这个索引上进行搜索以找到包含某个关键词或短语的文档。Lucene 提供了几个基础的类来完成这个过程,它们分别是呢 IndexSearcher, Term, Query, TermQuery, Hits. 下面我们分别介绍这几个类的功能。

Query
这是一个抽象类,他有多个实现,比如 TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query。

Term
Term 是搜索的基本单位,一个 Term 对象有两个 String 类型的域组成。生成一个 Term 对象可以有如下一条语句来完成:Term term = new Term(“fieldName”,”queryWord”); 其中第一个参数代表了要在文档的哪一个 Field 上进行查找,第二个参数代表了要查询的关键词。

TermQuery
TermQuery 是抽象类 Query 的一个子类,它同时也是 Lucene 支持的最为基本的一个查询类。生成一个 TermQuery 对象由如下语句完成: TermQuery termQuery = new TermQuery(new Term(“fieldName”,”queryWord”)); 它的构造函数只接受一个参数,那就是一个 Term 对象。

IndexSearcher

IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher 的实例在一个索引上进行操作。

Hits
Hits 是用来保存搜索的结果的。

介绍完这些搜索所必须的类之后,我们就开始在之前所建立的索引上进行搜索了,下面给出搜索类的源代码:

 

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.wltea.analyzer.lucene.IKQueryParser;

 

public class LuceneSearch
{
 public IndexSearcher mSearch = null;//用于搜索的对象

 /**
  * @功能描述 打开一个索引目录
  * @输入参数  indexDirectory 索引目录
  * @反馈值
  */
 public void openLuceneSearch(Directory indexDirectory) throws CorruptIndexException, IOException
 {
  mSearch = new IndexSearcher(indexDirectory, true);
 }

 public void close()
 {
  try
  {
   if (mSearch != null)
   {
    mSearch.close();
   }
  } catch (Exception e)
  {
  }
 }

 /**
  * @功能描述 搜索关键字
  * @输入参数 keyword为搜索关键字,start为起始点,top为返回多少条数据
  * @反馈值
  */
 public List<Document> search(String keyword, int start, int top) throws Exception
 {
  if (mSearch == null)
  {
   throw new Exception("没有初始化 Lucene Index Search");
  }

  Query query = IKQueryParser.parse(LuceneIndex.CONTENT_KEY_NAME, keyword);
  return search(query, start, top);
 }
 
 /**
  * @功能描述 根据已经定制好的查询返回查询结果
  * @输入参数 query 已经定制好的查询,start 起始结果,count 结果数量
  * @反馈值
  */
 public List<Document> search(Query query, int start, int count) throws Exception
 {
  if (mSearch == null)
  {
   throw new Exception("没有初始化 Lucene Index Search");
  }

  List<Document> docs = new ArrayList<Document>();
  TopDocs theDocs = mSearch.search(query, 1000);

  int resultCount = theDocs.scoreDocs.length;
  start = Math.min(start, resultCount);
  int end = Math.min(start + count, resultCount);

  for (int i = start; i < end; ++i)
  {
   Document doc = mSearch.doc(theDocs.scoreDocs[i].doc);
   docs.add(doc);
  }

  return docs;
 }
 
}


(3)主方法进行测试

 

 import java.io.File;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;

 

public class TestMain
{
 public static void main(String[] args) throws Exception
 {
  if (args.length == 3)
  {
   if (args[0].equalsIgnoreCase("createindex"))
   {
    String indexDirectory = args[1];//最终放置索引位置D:\2
    String docDirectory = args[2];//文档路径D:\1
    LuceneIndex.indexService(indexDirectory, docDirectory);
   }
  } else if (args.length == 4)
  {
   if (args[0].equalsIgnoreCase("search"))
   {
    LuceneSearch search = new LuceneSearch();
    try
    {
     String indexDirectory = args[1];//D:\2
     String keyword = args[2];//要查找的字
     int top = Integer.parseInt(args[3]);//查找范围

     System.out.println("关键字为 :" + keyword);

     Directory directory = new SimpleFSDirectory(new File(indexDirectory));

     search.openLuceneSearch(directory);
     List<Document> docs = search.search(keyword, 0, top);
     System.out.println("结果总数" + docs.size());

     for (Document doc : docs)
     {
      System.out.println("结果:" + doc.getField(LuceneIndex.FILE_KEY_NAME).stringValue());
     }
    } catch (Exception e)
    {
     e.printStackTrace();
     return;
    } finally
    {
     search.close();
    }
   }
  }
 }

}

点击myeclipse中,绿色有个向右的箭头旁边的向下的按钮,选择open run dialog对话框,在java Application上点击右键,选择new,新建一个起名为index,然后选择index,在Arguments中的Program arguments中输入,

createindex  D:\2  D:\1  点应用,就开始创建索引。

 

同理创建一个search应用,在Arguments 中的Program arguments中输入

search D:\2  要搜索的关键字  搜索范围(默认值,随便给1000)

点应用,开始搜索,查看控制台有没有输出,如果有,说明成功,如果没有,在看看是不是编码的问题。

 

 

 

 

分享到:
评论

相关推荐

    Lucene3.0全文信息检索

    **Lucene 3.0 全文信息检索** Lucene 是一个由Apache软件基金会4...随着技术的不断进步,Lucene后续版本继续优化性能和扩展功能,但3.0版本仍然是许多项目的基础,其设计理念和实现方式对于理解全文检索引擎至关重要。

    全文检索 lucene 3.0

    总的来说,全文检索Lucene 3.0是一个强大而灵活的工具,它简化了文本搜索的复杂性,提高了搜索效率,为各种应用程序提供了高效的全文检索解决方案。通过深入学习和实践,开发者可以利用Lucene构建出满足用户需求的...

    lucene3.0全文检索入门实例

    本文将重点介绍如何使用 Lucene 3.0 实现全文检索的基本步骤,以及与前一版本 Lucene 2.0 的主要区别。 **1. 安装与环境配置** 首先,你需要下载 Lucene 3.0 的发行版,并将其添加到你的项目类路径中。确保你的开发...

    Lucene3.0 使 用 教 程

    通过学习Lucene3.0 使用教程,开发者能够掌握全文检索的基本原理和技术,为自己的应用系统添加高效、准确的搜索功能。这不仅限于网站内部,也可以应用于桌面应用程序、帮助系统等多种场景。随着技术的深入,开发者还...

    Lucene 3.0 原理与代码分析

    总之,Lucene 3.0的原理与代码分析为我们揭示了全文检索引擎的工作机制,这些基础知识对于理解和使用任何版本的Lucene都至关重要。通过深入学习,开发者可以更好地利用Lucene构建高效、精准的搜索系统。

    lucene3.0核心jar包

    Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发并维护。它提供了高级的文本分析、索引和搜索功能,被广泛应用于...尽管现在已经有了更新的版本,但 Lucene 3.0 仍然是学习和理解全文检索技术的重要里程碑。

    Lucene 3.0 原理与代码分析完整版

    Lucene是Apache软件基金会的开源项目,它为Java开发者提供了一个高性能、全文检索的工具包,广泛应用于各种信息检索系统。这本书详细介绍了Lucene的核心原理和内部实现机制,并通过代码分析帮助读者更好地理解和应用...

    lucene3.0使用介绍及实例

    Lucene是一个强大的全文检索库,由Apache软件基金会开发并维护,广泛应用于各种搜索引擎的构建。在本文中,我们将深入探讨Lucene 3.0版本,了解其核心概念、功能特性,并通过实例来展示如何使用这个强大的工具。 ##...

    lucene3.0资料包

    总结,Lucene3.0是全文检索领域的一个强大工具,其索引构建、分词、查询解析、搜索算法等功能在当时具有很高的技术水平,并且具有高度的灵活性和扩展性。通过深入学习和应用Lucene3.0,开发者可以构建出高效、智能的...

    lucene3.0 实例

    Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发,它为 Java 开发人员提供了强大的文本搜索功能。在 Lucene 3.0 版本中,虽然已经相对较旧,但仍然包含了基本的搜索引擎功能,适用于简单或特定场景的搜索...

    lucene3.0庖丁+索引搜索程序

    Lucene3.0是Apache软件基金会的一个项目,它是Java语言实现的全文检索引擎,提供了高性能、可扩展的搜索和分析功能。Lucene的核心包括索引构建、倒排索引、查询解析和结果排序等关键部分。3.0版本相比之前的版本,在...

    lucene3.0 search

    Lucene 3.0是Apache软件基金会开发的一款高性能、全文检索引擎库,它提供了一个高级的API,用于索引和搜索大量文本数据。此版本主要关注性能优化和稳定性的提升,同时保持了对之前版本的向后兼容性。开发者可以利用...

    汤阳光_Lucene3.0课程

    【Lucene3.0课程】主要讲解了如何利用Lucene这一全文检索库来实现站内搜索功能,如在BBS、BLOG、电子商务网站中搜索文章或商品信息。Lucene被广泛应用,包括Eclipse、Jira等多个知名项目。全文检索是针对文本内容的...

    Lucene 3.0完成入门

    Lucene 是一个开源的全文检索库,由 Apache 软件基金会维护。它为开发者提供了一种高级的文本搜索功能,允许他们在应用程序中集成强大的搜索引擎。本篇文章将围绕 Lucene 3.0 版本,详细介绍其入门知识,并通过提供...

    Lucene 3.0 原理

    它为开发者提供了一套强大的工具,用于在各种应用程序中实现全文检索功能。在 Lucene 3.0 版本中,其核心功能和设计原理依然沿袭了之前的版本,但同时也进行了一些优化和改进,使得搜索性能更加高效,功能更加完善。...

    lucene3.0 api jar

    使用Lucene 3.0的API,开发者可以实现全文检索、模糊查询、短语查询、布尔查询等多种复杂的搜索功能。同时,还可以利用`Highlighter`对搜索结果中的关键词进行高亮显示,提升用户体验。 然而,需要注意的是,尽管...

    lucene3.0英文API

    Lucene 3.0是该库的一个重要版本,引入了许多改进和新特性,使得开发者能够更高效地构建复杂的全文检索应用。 **一、Lucene的基本概念** 1. **索引(Indexing)**:Lucene首先对数据进行索引,将非结构化的文本转换...

    lucene3.0

    《深入理解Lucene 3.0:开源全文检索框架解析》 Lucene是一个高性能、可扩展的信息检索库,由Apache软件基金会开发并维护。作为Java编写的核心搜索库,Lucene为开发者提供了强大的文本分析和索引功能,是构建全文...

    基于lucene3.0的搜索器源程序

    总结,基于Lucene 3.0的搜索器源程序为企业级的全文检索应用提供了基础,它不仅可以帮助开发者快速构建高效的搜索功能,还支持在Web环境中部署,通过用户友好的界面提供交互式搜索体验。通过深入学习和实践,我们...

Global site tag (gtag.js) - Google Analytics