`

建立、维护索引:简单示例 

阅读更多

5.1 最简单的能完成索引的代码片断

IndexWriter writer = new IndexWriter(“/data/index/”, new StandardAnalyzer(), true);
Document doc = new Document();
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("content", "lucene works well", Field.Store.YES, Field.Index.TOKENIZED));
writer.addDocument(doc);
writer.optimize();
writer.close();

下面我们分析一下这段代码。
首先我们创建了一个writer,并指定存放索引的目录为“/data/index”,使用的分析器为StandardAnalyzer,第三个参数说明如果已经有索引文件在索引目录下,我们将覆盖它们。
然后我们新建一个document。
我们向document添加一个field,名字是“title”,内容是“lucene introduction”,对它进行存储并索引。
再添加一个名字是“content”的field,内容是“lucene works well”,也是存储并索引。
然后我们将这个文档添加到索引中,如果有多个文档,可以重复上面的操作,创建document并添加。
添加完所有document,我们对索引进行优化,优化主要是将多个segment合并到一个,有利于提高索引速度。
随后将writer关闭,这点很重要。

对,创建索引就这么简单!
当然你可能修改上面的代码获得更具个性化的服务。

5.2 将索引直接写在内存
你需要首先创建一个RAMDirectory,并将其传给writer,代码如下:

Directory dir = new RAMDirectory();
IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true);
Document doc = new Document();
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("content", "lucene works well", Field.Store.YES, Field.Index.TOKENIZED));
writer.addDocument(doc);
writer.optimize();
writer.close();

5.3 索引文本文件
如果你想把纯文本文件索引起来,而不想自己将它们读入字符串创建field,你可以用下面的代码创建field:

Field field = new Field("content", new FileReader(file));

这里的file就是该文本文件。该构造函数实际上是读去文件内容,并对其进行索引,但不存储。

6 如何维护索引
索引的维护操作都是由IndexReader类提供。

6.1 如何删除索引
lucene提供了两种从索引中删除document的方法,一种是

void deleteDocument(int docNum)

这种方法是根据document在索引中的编号来删除,每个document加进索引后都会有个唯一编号,所以根据编号删除是一种精确删除,但是这个编号是索引的内部结构,一般我们不会知道某个文件的编号到底是几,所以用处不大。另一种是

void deleteDocuments(Term term)

这种方法实际上是首先根据参数term执行一个搜索操作,然后把搜索到的结果批量删除了。我们可以通过这个方法提供一个严格的查询条件,达到删除指定document的目的。
下面给出一个例子:

Directory dir = FSDirectory.getDirectory(PATH, false);
IndexReader reader = IndexReader.open(dir);
Term term = new Term(field, key);
reader.deleteDocuments(term);
reader.close();

6.2 如何更新索引
lucene并没有提供专门的索引更新方法,我们需要先将相应的document删除,然后再将新的document加入索引。例如:

Directory dir = FSDirectory.getDirectory(PATH, false);
IndexReader reader = IndexReader.open(dir);
Term term = new Term(“title”, “lucene introduction”);
reader.deleteDocuments(term);
reader.close();

IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true);
Document doc = new Document();
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("content", "lucene is funny", Field.Store.YES, Field.Index.TOKENIZED));
writer.addDocument(doc);
writer.optimize();
writer.close();

 

资料来源:http://www.searcher.org.cn/html/lucene/20071213/367_3.html

分享到:
评论
1 楼 xuganggogo 2009-02-01  
package com.test.lucene;
import  java.io.BufferedReader;  
import  java.io.File;  
import  java.io.FileInputStream;  
import  java.io.IOException;  
import  java.io.InputStreamReader;  
import  java.util.Date;  

import jeasy.analysis.MMAnalyzer;
 
import  org.apache.lucene.analysis.Analyzer;
import  org.apache.lucene.document.Document;  
import  org.apache.lucene.document.Field;  
import  org.apache.lucene.index.IndexWriter;  
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MultiSearcher;
import org.apache.lucene.search.Query;
 
public   class  TestLucene  {  
     public   static   void  main(String[] args)  throws  Exception  {  
    //指明要索引文件夹的位置,这里是C盘的S文件夹下 
    File fileDir  =   new  File( "f:\\s" );  
    //这里放索引文件的位置
    File indexDir  =   new  File( "f:\\index" );          
    //采用正向最大匹配的中文分词算法
    Analyzer analyzer = new MMAnalyzer();
    IndexWriter indexWriter  =   new  IndexWriter(indexDir, analyzer,true,IndexWriter.MaxFieldLength.LIMITED   );  
    File[] textFiles  =  fileDir.listFiles();  
    System.out.println("文件一共有:"+ textFiles.length);
    long  startTime  =   new  Date().getTime();    
         // 增加document到索引去  
         for  ( int  i  =   0 ; i  <  textFiles.length; i ++ )  {  
             if  (textFiles[i].isFile() &&  textFiles[i].getName().endsWith(".txt"))  {  
                System.out.println( " File  "   +  textFiles[i].getCanonicalPath()+ " 正在被索引. " );  
                String temp  =  FileReaderAll(textFiles[i].getCanonicalPath(),"GBK" );  
                System.out.println(temp);  
                Document document = new Document();  
                Field FieldPath =  new Field( "path" , textFiles[i].getPath(),Field.Store.YES, Field.Index.ANALYZED); 
                Field FieldBody =  new Field( "body" , temp, Field.Store.YES, Field.Index.ANALYZED);     
                document.add(FieldPath);  
                document.add(FieldBody);  
                indexWriter.addDocument(document);  
            }   
        }   
         // optimize()方法是对索引进行优化  
        indexWriter.optimize();  
        indexWriter.close();  
        // 测试一下索引的时间  
        long  endTime  =   new  Date().getTime();  
        System.out.println("这花费了"+(endTime - startTime)+"毫秒来把文档增加到索引里面去!"+fileDir.getPath());  
        // 测试搜索  
        search("d");
    }
    
     //搜索方法
     public static void search(String serchString) throws Exception {
/* 创建一个搜索,搜索刚才创建的f:\\index目录下的索引 */
IndexSearcher indexSearcher = new IndexSearcher("f:\\index");
/* 在这里我们只需要搜索一个目录 */
IndexSearcher indexSearchers[] = { indexSearcher };
/* new一个默认域是"content",分词方法是MMAnalyzer的QueryParser类:域之后可以改变,分词方法用的是je-analysis*/
QueryParser parser = new QueryParser("content", new MMAnalyzer());
/* 字符串searchQuery用Query的语法来进行详细搜索 */
String searchQuery =  "+(path:"+serchString+"* body:"+serchString+"*)";
System.out.println("searchQuery"+searchQuery);
Query query = parser.parse(searchQuery);
/* Multisearcher表示多目录搜索,在这里我们只有一个目录 */
MultiSearcher searcher = new MultiSearcher(indexSearchers);
/* 开始搜索 */
Hits h = searcher.search(query);
System.out.println("列出搜索结果…………");
for (int i = 0; i < h.length(); i++) {
/* 打印出文件里面path域里面的内容 */
System.out.println("path结果:"+h.doc(i).get("path"));
System.out.println("body结果:"+h.doc(i).get("body"));
}
searcher.close();
}
 
     public static String FileReaderAll(String FileName, String charset)throws IOException  {  
        BufferedReader reader =  new BufferedReader( new InputStreamReader( new FileInputStream(FileName),charset));  
        String line = new  String();  
        String temp = new  String();  
         while ((line = reader.readLine())!= null ){
            temp += line;  
        }   
        reader.close();  
        return  temp;  
    }   

相关推荐

    WEBHR9.0索引建立帮助文档.pdf

    文档列举了WEBHR系统各个模块的主要表及其建议建立的索引,包括组织机构、岗位规划、人事管理、合同管理、薪酬管理、考勤管理和系统维护等。每个表都列出了关键字段、描述以及是否需要建立唯一或聚簇索引。 五、...

    创建数据库表与索引实验.docx

    - 学生档案表的“学号”、“姓名”和“籍贯”字段建立一个普通升序索引。 - 学生档案表的“籍贯”字段建立普通升序索引。 #### 三、实验环境与器材 - **硬件**:计算机 - **网络环境**:局域网或互联网 - **软件...

    mysql高级部分--包含索引建立优化_函数_存储过程_触发器_及游标

    2. **降低写入性能:** 插入、删除和更新数据时,需要同步维护索引,这会降低这些操作的执行速度。 **理解索引的关键点:** - 当表中某一列被频繁用于查询条件,且表数据量较大时,建议创建索引。 - 索引的存在不会...

    数据库原理实践报告视图、索引的建立和维护;

    4. **索引的建立和维护**: 索引是为了加速数据检索而创建的数据结构。它们可以大大提高查询性能,但也会占用额外的存储空间,并可能影响到数据插入和更新的速度。`CREATE INDEX`语句用于创建索引,`ALTER INDEX`和...

    Oracle 索引练习语句程序

    通过以上示例,我们学习了Oracle数据库中索引的基本使用方法以及一些高级特性,如分区表索引、唯一索引、函数索引等。此外,还了解了如何通过实际的数据操作来测试索引的性能效果。这些知识点对于深入理解和掌握...

    数据库索引

    通过建立索引,可以显著减少查找的时间,因为索引会预先存储数据的关键信息,并以一种易于搜索的方式组织起来。 #### 二、索引的目的与优点 **目的:** - 加快表中记录的查询速度。 - 提高排序效率。 **优点:** ...

    Phoenix构建二级索引.rar

    3. 索引更新:当数据发生变化时,Phoenix会自动维护二级索引,确保索引的准确性。 4. 使用二级索引:在SELECT语句中指定索引,提高基于非主键的查询性能。 5. 索引管理:定期评估索引效果,根据查询模式调整索引策略...

    深入浅出理解索引结构

    此外,还应考虑到索引的维护成本,过多的索引会影响插入、更新和删除操作的性能。 下面是一些示例SQL语句,用于创建聚集索引和非聚集索引: ```sql -- 创建聚集索引 CREATE CLUSTERED INDEX idx_department ON ...

    [Oracle]如何在亿级记录表中创建索引

    对于分区表来说,了解每个分区的大小可以帮助我们更好地评估资源分配,并且对后续索引的创建和维护提供指导。 **命令示例:** ```sql SQL&gt; select segment_name, partition_name, round(bytes / 1024 / 1024) 2 ...

    浅谈oracle中重建索引

    当表中的数据发生变化时,Oracle会自动维护索引树,确保其反映最新的数据状态。值得注意的是,索引树中并没有更新操作,只有删除和插入操作。例如,在某表的ID列上创建索引后,如果将某行的ID值从“101”更新为“110...

    c++实现倒排索引算法

    倒排索引是一种高效的数据结构,常用于全文搜索引擎和数据库系统中,用于快速查找包含特定词汇的文档或数据。在C++中实现倒排索引算法可以帮助我们理解其原理并优化搜索性能。以下是对倒排索引算法及其C++实现的详细...

    用lucene对数据库建立索引及搜索

    **使用Lucene对数据库建立索引及搜索** Lucene是一个高性能、可伸缩的信息检索库,它是Apache软件基金会的顶级项目之一。它提供了一个简单但功能强大的API,用于在各种数据源上创建全文搜索引擎,包括数据库。在本...

    oracle索引机制分析

    - **连接索引**:连接索引是在两个或多个表之间建立的一种索引形式,可以优化多表连接查询的性能。 #### 3. 组合索引的使用方法 - **定义**:组合索引是指在一个索引中包含了多个列。这种方式可以支持包含多个列的...

    DBA运维之索引.pdf

    从给定文档的内容中我们可以看到,在未建立索引时,一个简单的COUNT(*)查询需要访问1073次数据块,并且耗时较长;而在建立了索引后,执行同样的查询仅需访问163次数据块,且耗时大为减少。 2. 索引建立时机 在...

    性能加速器:MySQL中索引的创建与优化

    2. **数据类型**:通常情况下,数值类型的数据比字符串类型的数据更容易建立有效的索引。 3. **数据分布**:如果某一列中数据分布较为均匀,则该列适合作为索引列。反之,如果某列中大部分数据相同,则创建索引可能...

    oracle建立索引

    因此,在创建索引时需要权衡其带来的查询性能提升与维护索引所需的额外开销之间的关系。 #### 八、其他类型的索引 除了B树索引之外,Oracle还支持其他类型的索引,包括但不限于: 1. **位图索引**:适用于包含...

    Lucene建立索引

    - `LuceneTest`可能是这个项目的主要测试类,它可能包含创建索引、查询索引以及展示结果的代码示例。 - 学习该项目,应关注如何实例化`Directory`(如`FSDirectory`)、选择合适的`Analyzer`(如`StandardAnalyzer...

    oracle 索引文档

    ### Oracle索引文档知识点详解 #### 一、索引的概念 **索引定义**:索引是一种与表或视图关联的数据结构,旨在提高从表或视图中检索数据...合理设计和维护索引不仅可以提高查询效率,还能确保数据的完整性和一致性。

Global site tag (gtag.js) - Google Analytics