`
xiaodongdong
  • 浏览: 80264 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

lucene4学习笔记之初识Lucene

阅读更多

 

 

Lucene介绍

Lucene总的来说是:

·        一个高效的,可扩展的,全文检索库。

·         全部用Java实现,无须配置。

·         仅支持纯文本文件的索引(Indexing)和搜索(Search)

·         不负责由其他格式的文件抽取纯文本文件,或从网络中抓取文件的过程。

Lucene in action中,Lucene 的构架和过程如下图,

 

 

说明Lucene是有索引和搜索的两个过程,包含索引创建,索引,搜索三个要点。

让我们更细一些看Lucene的各组件:

 

 

·         被索引的文档用Document对象表示。

·         IndexWriter通过函数addDocument将文档添加到索引中,实现创建索引的过程。

·         Lucene的索引是应用反向索引。

·         当用户有请求时,Query代表用户的查询语句。

·         IndexSearcher通过函数search搜索Lucene Index

·         IndexSearcher计算term weightscore并且将结果返回给用户。

·         返回给用户的文档集合用TopDocsCollector表示。

 

lucene使用

上面基本上知道了Lucene是一个什么样的东西了,下面我们来看一下如何使用它,我使用的是lucene 4.2.1版本,既然要构建索引,我们肯定需要指定索引目录及被索引的文件目录,使用的如下:

文件名

路径

内容

test1.txt

D:\code\lucenestudy\source

I am working in Hangzhou

test2.txt

D:\code\lucenestudy\source

My English is very bad

test3.txt

D:\code\lucenestudy\source

Do you want have a holiday?

test4.txt

D:\code\lucenestudy\source

I am 24 years old

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

Document

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

 

Field

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

 

Analyzer

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

 

IndexWriter

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

 

Directory

这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是RAMDirectory,它表示一个存储在内存当中的索引的位置。熟悉了建立索引所需要的这些类后,我们就开始对某个目录下面的文本文件建立索引了,示例代码如下:

 

public static void main(String[] args) throws Exception {
      // 指定索引文件存放目录
      File indexDir = new File("D://code//lucenestudy//index");
      // 指定被索引文件存放目录
      File dataDir = new File("D://code//lucenestudy//source");
     
      //被索引文件目录文件列表
      File[] dataFiles = dataDir.listFiles();
     
     
      Directory dir = FSDirectory.open(indexDir);
      //新那家一个分词处理器
      Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_42);
     
      //初始化一个indexWriter的配置项
      IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_42, analyzer);
 
      IndexWriter indexWriter = new IndexWriter(dir, iwc);
      long startTime = new Date().getTime();
      for (int i = 0; i < dataFiles.length; i++) {
         if (dataFiles[i].isFile()) {
            System.out.println("开始索引文件: " + dataFiles[i].getCanonicalPath());
            Document document = new Document();
           
            //添加Field
            Field pathField = new StringField("path", dataFiles[i].getPath(), Field.Store.YES);
            document.add(pathField);
            document.add(new LongField("modified", dataFiles[i].lastModified(), Field.Store.NO));
           
            FileInputStream fis = new FileInputStream(dataFiles[i]);
            document.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, "UTF-8"))));
 
            indexWriter.addDocument(document);
         }
      }
      indexWriter.commit();
      indexWriter.close();
      long endTime = new Date().getTime();
 
      System.out.println("本次构建索引共花费" + (endTime - startTime)
            + " s 索引目录为: " + dataDir.getPath());
   }
 

 

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

 

Query

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

 

QueryParser

解析查询query。

 

TopDocs

TopDocs用来保存搜索到的结果。

 

IndexSearcher

IndexSearcher是搜索过程中一个核心类,通过query进行查询,并返回搜索到的结果集,它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher 的实例在一个索引上进行操作示例代码如下:

  

 public static void main(String[] args) throws Exception {
      //指定索引文件存放目录
      String index = "D://code//lucenestudy//index";
      String field = "contents";
      int hitsPerPage = 10;
 
      //搜索关键字
      String queryString = "holiday";
      //读取索引文件
      IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(index)));
      //初始化indexSearcher
      IndexSearcher searcher = new IndexSearcher(reader);
      Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_42);
      //初始化query解析器
      QueryParser parser = new QueryParser(Version.LUCENE_42, field, analyzer);
      //解析query
      Query query = parser.parse(queryString);
      //搜索
      TopDocs resultsDocs = searcher.search(query, 5 * hitsPerPage);
 
      System.out.println(resultsDocs.totalHits + " 个匹配文档");
      ScoreDoc[] hits = resultsDocs.scoreDocs;
      for (ScoreDoc scoreDoc : hits) {
         System.out.println("doc=" + scoreDoc.doc + " score=" + scoreDoc.score);
         //通过docId得到满足查询条件的document
         Document doc = searcher.doc(scoreDoc.doc);
         System.out.println("modified: " + doc.get("modified"));
         System.out.println("path: " + doc.get("path"));
      }
      reader.close();
   }
 

 

 

综述

让我们再回顾下Lucene API 的调用实现索引和搜索过程:



 

·         索引过程如下:

·         创建一个IndexWriter用来写索引文件,它有几个参数,INDEX_DIR就是索引文件所存放的位置,Analyzer便是用来对文档进行词法分析和语言处理的。

·         创建一个Document代表我们要索引的文档。

·         将不同的Field加入到文档中。我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等。不同类型的信息用不同的Field来表示,在本例子中,一共有两类信息进行了索引,一个是文件路径,一个是文件内容。其中FileReaderSRC_FILE就表示要索引的源文件。

·         IndexWriter调用函数addDocument将索引写到索引文件夹中。

·         搜索过程如下:

·         IndexReader将磁盘上的索引信息读入到内存,INDEX_DIR就是索引文件存放的位置。

·         创建IndexSearcher准备进行搜索。

·         创建Analyer用来对查询语句进行词法分析和语言处理。

·         创建QueryParser用来对查询语句进行语法分析。

·         QueryParser调用parser进行语法分析,形成查询语法树,放到Query中。

·         IndexSearcher调用search对查询语法树Query进行搜索,得到结果TopDocs

以上便是Lucene API函数的简单调用。然而当进入Lucene的源代码后,发现Lucene有很多包,关系错综复杂。了解了Lucene的整个结构,我们便可以开始Lucene的源码之旅了。

 

  • 大小: 67.1 KB
  • 大小: 38.7 KB
  • 大小: 246.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics