`

Lucene4 建立索引 搜索 的 入门例子

 
阅读更多

http://www.haogongju.net/art/1886956

 

 

Lucene 简介

Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。

目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。

图 1 表示了搜索应用程序和 Lucene 之间的关系,也反映了利用 Lucene 构建搜索应用程序的流程:


图 1. 搜索应用程序和 Lucene 之间的关系

索引和搜索

索引是现代搜索引擎的核心,建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。为什么索引这么重要呢,试想你现在要在大量的文档中搜索含有某个关键词的文档,那么如果不建立索引的话你就需要把这些文档顺序的读入内存,然后检查这个文章中是不是含有要查找的关键词,这样的话就会耗费非常多的时间,想想搜索引擎可是在毫秒级的时间内查找出要搜索的结果的。这就是由于建立了索引的原因,你可以把索引想象成这样一种数据结构,他能够使你快速的随机访问存储在索引中的关键词,进而找到该关键词所关联的文档。Lucene 采用的是一种称为反向索引(inverted index)的机制。反向索引就是说我们维护了一个词 / 短语表,对于这个表中的每个词 / 短语,都有一个链表描述了有哪些文档包含了这个词 / 短语。这样在用户输入查询条件的时候,就能非常快的得到搜索结果。我们将在本系列文章的第二部分详细介绍 Lucene 的索引机制,由于 Lucene 提供了简单易用的 API,所以即使读者刚开始对全文本进行索引的机制并不太了解,也可以非常容易的使用 Lucene 对你的文档实现索引。

对文档建立好索引后,就可以在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析,然后再在建立好的索引上面进行查找,最终返回和用户输入的关键词相关联的文档。


Lucene 软件包分析

Lucene 软件包的发布形式是一个 JAR 文件,下面我们分析一下这个 JAR 文件里面的主要的 JAVA 包,使读者对之有个初步的了解。

Package: org.apache.lucene.document

这个包提供了一些为封装要索引的文档所需要的类,比如 Document, Field。这样,每一个文档最终被封装成了一个 Document 对象。

Package: org.apache.lucene.analysis

这个包主要功能是对文档进行分词,因为文档在建立索引之前必须要进行分词,所以这个包的作用可以看成是为建立索引做准备工作。

Package: org.apache.lucene.index

这个包提供了一些类来协助创建索引以及对创建好的索引进行更新。这里面有两个基础的类:IndexWriter 和 IndexReader,其中 IndexWriter 是用来创建索引并添加文档到索引中的,IndexReader 是用来删除索引中的文档的。

Package: org.apache.lucene.search

这个包提供了对在建立好的索引上进行搜索所需要的类。比如 IndexSearcher 和 Hits, IndexSearcher 定义了在指定的索引上进行搜索的方法,Hits 用来保存搜索得到的结果。


一个简单的搜索应用程序

假设我们的电脑的目录中含有很多文本文档,我们需要查找哪些文档含有某个关键词。为了实现这种功能,我们首先利用 Lucene 对这个目录中的文档建立索引,然后在建立好的索引中搜索我们所要查找的文档。通过这个例子读者会对如何利用 Lucene 构建自己的搜索应用程序有个比较清楚的认识。


-------------------------------建立索引-------------------------------

为了对文档进行索引,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,它表示一个存储在内存当中的索引的位置。

熟悉了建立索引所需要的这些类后,我们就开始对某个目录下面的文本文件建立索引了,清单 1 给出了对某个目录下的文本文件建立索引的源代码

import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;import java.util.Date;import org.apache.lucene.analysis.Analyzer;import org.apache.lucene.analysis.standard.StandardAnalyzer;import org.apache.lucene.document.Document;import org.apache.lucene.document.Field;import org.apache.lucene.document.StringField;import org.apache.lucene.document.TextField;import org.apache.lucene.index.IndexWriter;import org.apache.lucene.index.IndexWriterConfig;import org.apache.lucene.index.Term;import org.apache.lucene.index.IndexWriterConfig.OpenMode;import org.apache.lucene.store.Directory;import org.apache.lucene.store.FSDirectory;import org.apache.lucene.util.Version;/*** This class demonstrate the process of creating index with Lucene* for text files*/public class TxtFileIndexer {public static void main(String[] args) throws Exception{//indexdir是Lucene程序的索引文件存放目录File indexDir = new File("D:\\lucene\\temp\\index");//datadir是对本地的文本文件进行索引的目录File dataDir  = new File("D:\\lucene\\temp\\test");//分词方法Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_42);IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42, luceneAnalyzer);if (true) {//创建一个新的索引文件或覆盖现有文件config.setOpenMode(OpenMode.CREATE);} else {//如果不存在,创建一个新的索引文件,否则打开索引文件将被附加config.setOpenMode(OpenMode.CREATE_OR_APPEND);}//写入指定目录中的索引文档(文件存储索引)Directory directory = FSDirectory.open(indexDir);//第一个参数指定了所创建的索引要存放的位置,可以是一个 FSDirectory 对象或者 RAMDirectory 对象//第二个参数指定了 Analyzer 类的一个实现,也就是指定这个索引是用哪个分词器对文挡内容进行分词。IndexWriter indexWriter = new IndexWriter(directory,config);//遍历了目录下面的所有文本文档,并为每一个文本文档创建了一个 Document 对象long startTime = new Date().getTime();//获取数据源File[] dataFiles  = dataDir.listFiles();for(int i = 0; i < dataFiles.length; i++){//把文本文档的两个属性:路径和内容加入到了两个 Field 对象中,接着在把这两个 Field 对象加入到 Document 对象中,//最后把这个文档用 IndexWriter 类的 add 方法加入到索引中去//当前用例只对文本文件进行索引if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){System.out.println("索引文件: " + dataFiles[i].getCanonicalPath());Document document = new Document();File file=dataFiles[i];//Field.Store指定当前字段的索引方式。//Field.Store.NO:不要在索引中存储的字段的值。//Field.Store.YES:在索引存储原始字段值。//TextField.TYPE_STORED:索引,分词,存储。//TextField.TYPE_NOT_STORED:索引,分词,不存储。//存储文件路径document.add(new StringField("id",i+"",Field.Store.YES));document.add(new StringField("path",file.getCanonicalPath(),Field.Store.YES));//存储文件内容流FileInputStream fis=new FileInputStream(file);BufferedReader bTxtReader=new BufferedReader(new InputStreamReader(fis, "UTF-8"));document.add(new TextField("contents",bTxtReader));//将文档对象写入到索引文件if (indexWriter.getConfig().getOpenMode() == OpenMode.CREATE) {// 新的索引,所以我们只是添加文件(没有旧的索引文件存在那里)System.out.println("adding " + file);indexWriter.addDocument(document);} else {//如果存在的话现有的索引(这个文件的旧副本可能已被索引的)所以我们使用updatedocument代替代替旧的匹配确切的路径System.out.println("updating " + file);indexWriter.updateDocument(new Term("path", file.getPath()), document);}}}//indexWriter.optimize();indexWriter.commit();indexWriter.close();long endTime = new Date().getTime();System.out.println("它需要 " + (endTime - startTime)+" 毫秒来创建目录中的文件索引 " + dataDir.getPath());}}



在清单 1 中,我们注意到类 IndexWriter 的构造函数需要三个参数,第一个参数指定了所创建的索引要存放的位置,他可以是一个 File 对象,也可以是一个 FSDirectory 对象或者 RAMDirectory 对象。第二个参数指定了 Analyzer 类的一个实现,也就是指定这个索引是用哪个分词器对文挡内容进行分词。第三个参数是一个布尔型的变量,如果为 true 的话就代表创建一个新的索引,为 false 的话就代表在原来索引的基础上进行操作。接着程序遍历了目录下面的所有文本文档,并为每一个文本文档创建了一个 Document 对象。然后把文本文档的两个属性:路径和内容加入到了两个 Field 对象中,接着在把这两个 Field 对象加入到 Document 对象中,最后把这个文档用 IndexWriter 类的 add 方法加入到索引中去。这样我们便完成了索引的创建。接下来我们进入在建立好的索引上进行搜索的部分。



-------------------------------搜索文档-------------------------------

利用 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 是用来保存搜索的结果的。

介绍完这些搜索所必须的类之后,我们就开始在之前所建立的索引上进行搜索了,清单 2 给出了完成搜索功能所需要的代码。

import java.io.File;import org.apache.lucene.document.Document;import org.apache.lucene.index.DirectoryReader;import org.apache.lucene.index.IndexReader;import org.apache.lucene.index.Term;import org.apache.lucene.search.IndexSearcher;import org.apache.lucene.search.ScoreDoc;import org.apache.lucene.search.TermQuery;import org.apache.lucene.search.TopDocs;import org.apache.lucene.store.FSDirectory;/*** This class is used to demonstrate the* process of searching on an existing* Lucene index**/public class TxtFileSearcher {public static void main(String[] args) throws Exception{String queryStr = "License";//这是Lucene程序搜索的索引目录File indexDir = new File("D:\\lucene\\temp\\index");//FSDirectory directory = FSDirectory.getDirectory(indexDir,false);IndexReader reader = DirectoryReader.open(FSDirectory.open(indexDir));IndexSearcher searcher = new IndexSearcher(reader);if(!indexDir.exists()){System.out.println("Lucene索引是不存在的");return;}Term term = new Term("contents",queryStr.toLowerCase());TermQuery luceneQuery = new TermQuery(term);TopDocs results  = searcher.search(luceneQuery,1000);int numTotalHits = results.totalHits;System.out.println("共 " + numTotalHits + " 完全匹配的文档");ScoreDoc[] hits = results.scoreDocs;for(int i = 0; i < hits.length; i++){Document document = searcher.doc(hits[i].doc);String path = document.get("path");System.out.println("Id: "+document.get("id"));System.out.println("File: " + path);}}}



在清单 2 中,类 IndexSearcher 的构造函数接受一个类型为 Directory 的对象,Directory 是一个抽象类,它目前有两个子类:FSDirctory 和 RAMDirectory. 我们的程序中传入了一个 FSDirctory 对象作为其参数,代表了一个存储在磁盘上的索引的位置。构造函数执行完成后,代表了这个 IndexSearcher 以只读的方式打开了一个索引。然后我们程序构造了一个 Term 对象,通过这个 Term 对象,我们指定了要在文档的内容中搜索包含关键词”lucene”的文档。接着利用这个 Term 对象构造出 TermQuery 对象并把这个 TermQuery 对象传入到 IndexSearcher 的 search 方法中进行查询,返回的结果保存在 Hits 对象中。最后我们用了一个循环语句把搜索到的文档的路径都打印了出来。好了,我们的搜索应用程序已经开发完毕,怎么样,利用 Lucene 开发搜索应用程序是不是很简单。


总结

本文首先介绍了 Lucene 的一些基本概念,然后开发了一个应用程序演示了利用 Lucene 建立索引并在该索引上进行搜索的过程。希望本文能够为学习 Lucene 的读者提供帮助

 

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/***
 * This class demonstrate the process of creating index with Lucene* for text
 * files
 */

public class TxtFileIndexer {
 public static void main(String[] args) throws Exception {
  // indexdir是Lucene程序的索引文件存放目录
  File indexDir = new File("c:\\lucene");
  // datadir是对本地的文本文件进行索引的目录
  File dataDir = new File("c:\\Corpus - LDA-servlets");
  // 分词方法
  Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_42);
  IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42,luceneAnalyzer);
  if (true) {
   // 创建一个新的索引文件或覆盖现有文件
   config.setOpenMode(OpenMode.CREATE);
  } else {
   // 如果不存在,创建一个新的索引文件,否则打开索引文件将被附加
   config.setOpenMode(OpenMode.CREATE_OR_APPEND);
  }
  // 写入指定目录中的索引文档(文件存储索引)
  Directory directory = FSDirectory.open(indexDir);
  // 第一个参数指定了所创建的索引要存放的位置,可以是一个 FSDirectory 对象或者 RAMDirectory 对象
  // 第二个参数指定了 Analyzer 类的一个实现,也就是指定这个索引是用哪个分词器对文挡内容进行分词。
  IndexWriter indexWriter = new IndexWriter(directory, config);
  // 遍历了目录下面的所有文本文档,并为每一个文本文档创建了一个 Document 对象
  long startTime = new Date().getTime();
  // 获取数据源
  File[] dataFiles = dataDir.listFiles();
  for (int i = 0; i < dataFiles.length; i++) {
   // 把文本文档的两个属性:路径和内容加入到了两个 Field 对象中,接着在把这两个 Field 对象加入到 Document
   // 对象中,
   // 最后把这个文档用 IndexWriter 类的 add 方法加入到索引中去
   // 当前用例只对文本文件进行索引
   if (dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")) {
    System.out.println("索引文件: " + dataFiles[i].getCanonicalPath());
    Document document = new Document();
    File file = dataFiles[i];
    // Field.Store指定当前字段的索引方式。
    // Field.Store.NO:不要在索引中存储的字段的值。
    // Field.Store.YES:在索引存储原始字段值。
    // TextField.TYPE_STORED:索引,分词,存储。
    // TextField.TYPE_NOT_STORED:索引,分词,不存储。
    // 存储文件路径
    document.add(new StringField("id", i + "", Field.Store.YES));
    document.add(new StringField("path", file.getCanonicalPath(),Field.Store.YES));
    // 存储文件内容流
    FileInputStream fis = new FileInputStream(file);
    BufferedReader bTxtReader = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
    document.add(new TextField("contents", bTxtReader));
    // 将文档对象写入到索引文件
    if (indexWriter.getConfig().getOpenMode() == OpenMode.CREATE) {
     // 新的索引,所以我们只是添加文件(没有旧的索引文件存在那里)
     System.out.println("adding " + file);
     indexWriter.addDocument(document);
    } else {
     // 如果存在的话现有的索引(这个文件的旧副本可能已被索引的)所以我们使用updatedocument代替代替旧的匹配确切的路径
     System.out.println("updating " + file);
     indexWriter.updateDocument(
       new Term("path", file.getPath()), document);
    }
   }
  }// indexWriter.optimize();
  indexWriter.commit();
  indexWriter.close();
  long endTime = new Date().getTime();
  System.out.println("它需要 " + (endTime - startTime) + " 毫秒来创建目录中的文件索引 "+ dataDir.getPath());
 }
}

 

import java.io.File;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;

/**
 * * This class is used to demonstrate the* process of searching on an existing*
 * Lucene index*
 * */

public class TxtFileSearcher {
 
 public static void main(String[] args) throws Exception{
  String queryStr = "thread";
  //这是Lucene程序搜索的索引目录
  File indexDir = new File("c:\\Lucene");
  //FSDirectory directory = FSDirectory.getDirectory(indexDir,false);
  IndexReader reader = DirectoryReader.open(FSDirectory.open(indexDir));
  IndexSearcher searcher = new IndexSearcher(reader);
  if(!indexDir.exists()){
   System.out.println("Lucene索引是不存在的");
   return;
  }
  Term term = new Term("contents",queryStr.toLowerCase());
  TermQuery luceneQuery = new TermQuery(term);
  TopDocs results = searcher.search(luceneQuery,1000);
  int numTotalHits = results.totalHits;
  System.out.println("共 " + numTotalHits + " 完全匹配的文档");
  ScoreDoc[] hits = results.scoreDocs;
  for(int i = 0; i < hits.length; i++){
   Document document = searcher.doc(hits[i].doc);
   String path = document.get("path");
   System.out.println("Id: "+document.get("id"));
   System.out.println("File: " + path);
   }
  }
 
}

分享到:
评论

相关推荐

    Lucene索引搜索简介以及入门实例源码.rar

    3. **索引(Index)**:Lucene通过建立索引来提高搜索速度。索引是一个结构化的数据存储,包含了文档的关键信息,便于快速查找。 4. **分析器(Analyzer)**:在建立索引前,Lucene会使用分析器对文本进行处理,如...

    Lucene建立索引

    本工程旨在为初学者提供一个入门Lucene建立索引的实例,帮助理解并掌握这一技术。 **正文:** 1. **Lucene简介** - Lucene是一个高性能、全文本搜索库,适用于Java开发者,可以嵌入到各种应用程序中,创建强大的...

    lucene搜索的简单入门例子源代码

    本篇将通过一个简单的入门例子,带你了解如何使用Lucene进行搜索。 首先,我们要知道Lucene的核心组件包括文档(Document)、字段(Field)、索引(Index)和查询(Query)。在Lucene中,信息是以文档的形式存储,...

    Lucene 简单入门程序实例

    标题与描述:“Lucene简单入门程序实例”这一标题与描述明确指出文章将引导读者通过一个实际的示例来了解和掌握Lucene的基本操作。Lucene是一个高性能、全功能的文本搜索引擎库,它允许用户对文档进行索引和搜索。本...

    Lucene 4.8全文检索引擎入门示例文档

    它通过分析输入文本,将文本拆分成词元(tokens),并为每个词元建立索引。索引包含每个词元的文档频率信息,使得搜索操作能够迅速定位到包含特定词元的文档。 二、主要组件 1. **Analyzer**:分析器负责将输入...

    Lucene 的入门 实例 代码

    2. **建立索引**:通过`IndexWriter`类创建索引,指定索引路径和分析器(如`StandardAnalyzer`)。 3. **创建文档**:使用`Document`类表示要索引的数据,添加字段(如`Field`)并设置相应的属性。 4. **索引文档*...

    全文搜索引擎lucene入门

    4. **建立索引(Indexing)**:创建一个结构化的数据结构,使得可以快速定位到包含特定词元的文档。 5. **查询解析(Query Parsing)**:将用户的查询转换为适合索引结构的表示。 6. **排名(Scoring)**:根据索引...

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

    通过实例,我们可以创建一个简单的索引器,将文本文件或数据库内容导入Lucene索引,然后编写一个搜索引擎来查询这些内容。这通常涉及以下步骤: - 创建索引:定义Document结构,使用Analyzer处理Field,通过...

    Lucene 3.0完成入门

    - **分词**:Lucene 使用分词器(Tokenizer)将文档拆分为单独的词汇项(Tokens),这是建立索引的基础。 - **字段**:每个文档可以包含多个字段,如标题、内容、作者等,每个字段都有独立的索引。 2. **Java 中...

    Apache Lucene3.0 入门实例介绍

    这个入门实例将引导我们了解如何使用Lucene 3.0版本进行基本的索引和搜索操作。以下是对Lucene 3.0关键知识点的详细讲解: 1. **Lucene的架构**: Lucene的核心组件包括文档(Document)、字段(Field)、索引...

    Lucene 实时搜索视频详解

    1. **索引过程**:Lucene 的核心概念之一是建立索引,将原始文本数据转化为可快速查询的结构。这个过程包括分析(Analyzer)文本、分词、创建倒排索引等步骤。倒排索引允许我们快速定位包含特定词汇的文档。 2. **...

    Lucene4.7+IK Analyzer中文分词入门教程

    `LuceneIKUtil`则负责使用IK Analyzer对数据进行分词并建立索引。 分词是搜索引擎的关键步骤,IK Analyzer能够有效地处理中文词汇,如“银花感冒颗粒”、“感冒止咳糖浆”等,将其拆分为更小的有意义的单元,便于...

    一个经典Lucene入门模块及例子解析

    在这个经典Lucene入门模块中,我们将深入理解如何使用Lucene进行索引创建和搜索操作。 首先,我们来看Lucene如何建立数据的索引。这通常涉及以下几个步骤: 1. **索引创建**:使用 `IndexWriter` 对象来创建或更新...

    搜索引擎 Lucene PPT 教程

    3. 建立索引:将处理后的关键词与文档元数据关联,形成倒排索引,便于快速查找相关文档。 4. 存储索引:索引被存储在磁盘上,可供后续查询使用。 5. 查询处理:用户输入查询后,Lucene解析查询语句,生成查询计划并...

    开发自己的搜索引擎《lucene2.0+heritrix》一书对应的源码资料

    在《开发自己的搜索引擎》一书中,通过`ch2-lucene入门小例子`,读者可以了解到如何使用Lucene 2.0创建简单的搜索引擎,例如建立索引、执行搜索等基本操作。而`myReserch-可用的网络搜索引擎`可能包含一个完整的搜索...

    lucene.net+完全入门教程

    **Lucene.Net 全面入门教程** Lucene.Net是一个基于.NET框架的全文搜索引擎库,它为开发者提供了在.NET环境中构建高效、可扩展的全文检索应用的能力。Lucene最初由Apache软件基金会开发,是一个用Java编写的开源...

    lucene简单介绍及solr搭建使用

    Solr是建立在Lucene之上,为大型企业级应用提供搜索服务的平台。它不仅包含了Lucene的所有搜索功能,还添加了集群、分布式搜索、缓存、负载均衡、结果高亮、拼写检查、近似搜索等特性。Solr通过XML或JSON等格式的...

Global site tag (gtag.js) - Google Analytics