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

lucene in action笔记之一索引

    博客分类:
  • java
阅读更多
  1. 执行最简单索引过程需要的几个类:IndexWriter、Directory、Analyzer、Document、Field。简单例子如下所示:
    public static int index(File indexDir, File dataDir)
        throws IOException {
    
        if (!dataDir.exists() || !dataDir.isDirectory()) {
          throw new IOException(dataDir
            + " does not exist or is not a directory");
        }
        if (dataDir.isHidden() || !dataDir.canRead()||!dataDir.getName().endsWith(".txt")) {
        	throw new IOException(dataDir
        	        + " error!");
        }
    
        IndexWriter writer = new IndexWriter(indexDir,
          new StandardAnalyzer(), true);
        writer.setUseCompoundFile(false);
        //使用 IndexWriter's setUseCompoundFile(true) 创建复合文件,减少索引文件数量。
        
        System.out.println("Indexing " + dataDir.getCanonicalPath());
        
        Document doc = new Document();
        doc.add(Field.Text("contents", new FileReader(dataDir)));
        doc.add(Field.Keyword("filename", dataDir.getCanonicalPath()));
        writer.addDocument(doc);
    
        int numIndexed = writer.docCount();
        writer.optimize();
        writer.close();
        return numIndexed;
      }
     
  2. 索引过程的三个主要阶段:将数据转换成文本、分析文本、将分析后的文本保存到索引库中。              注1:Lucene只能索引文本文件,即.txt文件。注2:分析数据最有代表性的操作是要从输入中去掉一些使用很频繁但却没有实际意义的词,比如英文文本中的一些停止词(a,an,the,on,in等)。注3:数据是以倒排索引的数据结构进行存储,原因:倒排索引并不是回答“这个文档中包含那些单词?”,而是经过优化以后用来快速回答“那些文档包含词x?”
  3. 基本索引操作:1)Lucene允许那些拥有不同Field对象的Document对象在一个索引中共存;2)如果要索引一个基本词和它所有的同义词,可以同给一个相同的域赋予多个不同的值;3)删除索引中的文档用IndexReader,注意直到IndexReader调用close()后才真正将他们删除。4)每一个文档都有一个唯一的内部编号,但这不是永久的,编号是从0开始;
  4. IndexReader的几个方法:1) maxDoc():返回下一个可得到的文档的内部编号,编号从0开始;2)numDocs():返回索引中文档的数量;3)hasDeletions():检查一个索引是否包含了带有删除标记的文档;4) isDeleted(int):检查一个特定编号的文档状态;5)delete(int),delete(Term):删除指定文档。
  5. 对Document和Field调用setBoost(float)进行加权处理会在搜索时发挥作用。lucene的搜索结果是根据文档对象和查询的匹配相关度来排序,且每个匹配的文档对象都会有一个评分。评分公式有多个因子组成,加权因子就是其中一个。
  6. Lucene中自带的DateField类不能处理1970年之前的日期。
  7. Lucene通过在内部将数值处理为字符串的方式索引数值。如果需要索引的数字在自由形式文本里面出现,首先要做的就是选择支持数字的Analyzer类。
  8. 当索引数值域对象时,如果希望利用他们来进行范围查询,就用0填充。
  9. 如果希望能够按照某个域对象的值排序,就必须将它作为一个被索引但不被语汇单元化(分析器的一些操作,如提取单词、去除标点等)的域对象。用于排序的域对象一定是可以被转换为整型,浮点或者字符串的对象。
  10. 较小的maxFactor参数是内存的使用减少,并使索引更新的频率升高。---->数据实时性更强,但降低了索引过程的速度。注:较大的MaxFactor参数会导致索引文件数量增多,从而降低用户搜索的速度。
  11. 较大的maxMergeDocs参数更适用于批量索引的情况,较小的maxMergeDocs参数更适用于交互性较强的索引。
  12. 应用程序在处理maxFieldLength时,应该把它设置成Integer.MAX_VALUE。maxFieldLength的值可在索引过程中的任意时刻被修改,并对其后添加所有文档起作用。
    private void addDocuments(Document doc, int maxFieldLength)
        throws IOException {
        IndexWriter writer = new IndexWriter(dir, new SimpleAnalyzer(),
          true);
        writer.maxFieldLength = maxFieldLength;
        writer.addDocument(doc);
        writer.optimize();
        writer.close();
      }
  13. 对索引进行优化会把所有段合并成单个段,可以通过调用IndexWriter的optimize()方法来优化。
  14. 对索引优化只会提高搜索操作的速度,他对索引过程的速度没有影响。
  15. 在索引过程中对索引进行优化的做法并不值得提倡。优化最佳时机是在索引过程结束之后,且当你确认在此后的一段时间不会对索引文件进行更改的时候。
  16. 并发访问的原则:1)在某一时刻,只允许执行一个修改索引的操作。也就是说,在同一时间,一个索引文件只能被一个IndexWriter或IndexReader对象打开。   2) 无论任何时候,包括索引文件正在优化,或正在对索引执行文档的添加、更新或删除操作时,任意数量的只读操作都可以同时执行。
  17. IndexWriter和IndexReader都是线程安全的。但仍然注意在同一索引上不能同时打开IndexWriter和IndexReader。
  18. 索引锁是基于文件的,各个索引都有自认的所文件集,在默认情况下,所有的锁文件都会被创建在计算机的临时目录中,这个目录由Java的java.io.tmpdir中的系统属性所指定。
  19. write.lock文件用于阻止进程试图并发的修改一个索引。   commit.lock文件在对段进行读或合并操作时使用。强烈建议:不要对Lucene的锁机制进行随意修改。
  20. 对Lucene写入索引的过程进行调试,可以将IndexWriter的公有变量infoStream设定为OutputStream中的一种,诸如System.out等,从而使Lucene输出关于进行索引操作时的一些具体信息。如下所示:
    IndexWriter writer = new IndexWriter(dir, new SimpleAnalyzer(), true);
    writer.infoStream = System.out;
    ...
     
分享到:
评论
3 楼 yoyozizou 2008-07-24  
imjl 写道
呵呵,你看得lucene in action是中文版还是英文版?

如果是后者,这些中文是你的理解?

如果是前者,那么红字的中文是你的还是书里的?


貌似是直接引用书里的着重点都一样,红的只是把书里的着重一下,特别是doc.add(new Field(...))那一段,我还以为什么时候的老帖仔细一看08年的,汗
2 楼 imjl 2008-03-13  
呵呵,你看得lucene in action是中文版还是英文版?

如果是后者,这些中文是你的理解?

如果是前者,那么红字的中文是你的还是书里的?

1 楼 wangfengmadking 2008-03-12  
<div class='quote_title'>hank 写道</div><div class='quote_div'><ol><li><div>执行最简单索引过程需要的几个类:IndexWriter、Directory、Analyzer、Document、Field。简单例子如下所示:<pre name='code' class='java'>public static int index(File indexDir, File dataDir)
    throws IOException {

    if (!dataDir.exists() || !dataDir.isDirectory()) {
      throw new IOException(dataDir
        + " does not exist or is not a directory");
    }
    if (dataDir.isHidden() || !dataDir.canRead()||!dataDir.getName().endsWith(".txt")) {
    throw new IOException(dataDir
            + " error!");
    }

    IndexWriter writer = new IndexWriter(indexDir,
      new StandardAnalyzer(), true);
    writer.setUseCompoundFile(false);
    //使用 IndexWriter's setUseCompoundFile(true) 创建复合文件,减少索引文件数量。
   
    System.out.println("Indexing " + dataDir.getCanonicalPath());
   
    Document doc = new Document();
    doc.add(Field.Text("contents", new FileReader(dataDir)));
    doc.add(Field.Keyword("filename", dataDir.getCanonicalPath()));
    writer.addDocument(doc);

    int numIndexed = writer.docCount();
    writer.optimize();
    writer.close();
    return numIndexed;
  }</pre> </div></li><li><div>索引过程的三个主要阶段:将数据转换成文本、分析文本、将分析后的文本保存到索引库中。              注1:Lucene只能索引文本文件,即.txt文件。注2:分析数据最有代表性的操作是要从输入中去掉一些使用很频繁但却没有实际意义的词,比如英文文本中的一些停止词(a,an,the,on,in等)。注3:数据是以倒排索引的数据结构进行存储,原因:倒排索引并不是回答“这个文档中包含那些单词?”,而是经过优化以后用来快速回答“那些文档包含词x?”</div></li><li><div>基本索引操作:1)Lucene允许那些拥有不同Field对象的Document对象在一个索引中共存;2)如果要索引一个基本词和它所有的同义词,可以同给一个相同的域赋予多个不同的值;3)删除索引中的文档用IndexReader,注意直到IndexReader调用close()后才真正将他们删除。4)每一个文档都有一个唯一的内部编号,但这不是永久的,编号是从0开始;</div></li><li>IndexReader的几个方法:1) maxDoc():返回下一个可得到的文档的内部编号,编号从0开始;2)numDocs():返回索引中文档的数量;3)hasDeletions():检查一个索引是否包含了带有删除标记的文档;4) isDeleted(int):检查一个特定编号的文档状态;5)delete(int),delete(Term):删除指定文档。</li><li>对Document和Field调用setBoost(float)进行加权处理会在搜索时发挥作用。lucene的搜索结果是根据文档对象和查询的匹配相关度来排序,且每个匹配的文档对象都会有一个评分。评分公式有多个因子组成,加权因子就是其中一个。</li><li>Lucene中自带的DateField类不能处理1970年之前的日期。</li><li>Lucene通过在内部将数值处理为字符串的方式索引数值。如果需要索引的数字在自由形式文本里面出现,首先要做的就是选择支持数字的Analyzer类。</li><li>当索引数值域对象时,如果希望利用他们来进行范围查询,就用0填充。</li><li>如果希望能够按照某个域对象的值排序,就必须将它作为一个被索引但不被<strong><span style='color: #ff0000; background-color: #ffffff;'>语汇单元化</span></strong>(分析器的一些操作,如<span style='font-size: x-small;'>提取单词、去除标点等</span>)的域对象。用于排序的域对象一定是可以被转换为整型,浮点或者字符串的对象。</li><li>较小的maxFactor参数是内存的使用减少,并使索引更新的频率升高。----&gt;数据实时性更强,但降低了索引过程的速度。<span style='color: #ff0000;'>注:</span><span style='color: #000000;'>较大的MaxFactor参数会导致索引文件数量增多,从而降低用户搜索的速度。</span></li><li>较大的maxMergeDocs参数更适用于批量索引的情况,较小的maxMergeDocs参数更适用于交互性较强的索引。</li><li>应用程序在处理maxFieldLength时,应该把它设置成Integer.MAX_VALUE。maxFieldLength的值可在索引过程中的任意时刻被修改,并对其后添加所有文档起作用。<pre name='code' class='java'>private void addDocuments(Document doc, int maxFieldLength)
    throws IOException {
    IndexWriter writer = new IndexWriter(dir, new SimpleAnalyzer(),
      true);
    writer.maxFieldLength = maxFieldLength;
    writer.addDocument(doc);
    writer.optimize();
    writer.close();
  }</pre></li><li>对索引进行优化会把所有段合并成单个段,可以通过调用IndexWriter的optimize()方法来优化。</li><li>对索引优化只会提高搜索操作的速度,他对索引过程的速度没有影响。</li><li>在索引过程中对索引进行优化的做法并不值得提倡。优化最佳时机是在索引过程结束之后,且当你确认在此后的一段时间不会对索引文件进行更改的时候。</li><li>并发访问的原则:1)<span style='color: #ff0000;'>在某一时刻,只允许执行一个修改索引的操作。也就是说,在同一时间,一个索引文件只能被一个IndexWriter或IndexReader对象打开。</span>   2) 无论任何时候,包括索引文件正在优化,或正在对索引执行文档的添加、更新或删除操作时,任意数量的只读操作都可以同时执行。</li><li>IndexWriter和IndexReader都是线程安全的。但仍然注意在同一索引上不能同时打开IndexWriter和IndexReader。</li><li>索引锁是基于文件的,各个索引都有自认的所文件集,在默认情况下,所有的锁文件都会被创建在计算机的临时目录中,这个目录由Java的java.io.tmpdir中的系统属性所指定。</li><li>write.lock文件用于阻止进程试图并发的修改一个索引。   commit.lock文件在对段进行读或合并操作时使用。<span style='color: #ff0000;'>强烈建议:不要对Lucene的锁机制进行随意修改。</span></li><li><span style='color: #000000;'>对Lucene写入索引的过程进行调试,可以将IndexWriter的公有变量infoStream设定为OutputStream中的一种,诸如System.out等,从而使Lucene输出关于进行索引操作时的一些具体信息。如下所示:<pre name='code' class='java'>IndexWriter writer = new IndexWriter(dir, new SimpleAnalyzer(), true);
writer.infoStream = System.out;
...</pre> </span></li></ol></div>

相关推荐

    lucene in action 2nd edition, lucene in action 第二版 PDF

    《Lucene in Action 第二版》是一本深入探讨Apache Lucene全文检索库的专业书籍,它在Java开发领域具有很高的权威性。这本书详细介绍了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者和信息检索爱好者的...

    lucene in action 第二版

    《Lucene in Action 第二版》是一本专门介绍如何使用Lucene搜索引擎框架的书籍。Lucene是一个高性能的全文检索库,它允许开发者在应用程序中实现搜索功能。第二版意味着这本书经过了更新,以适应Lucene版本的变化。...

    Lucene In Action 第二版 高清中文版+附书源代码

    《Lucene In Action 第二版》是一本深入探讨Apache Lucene全文搜索引擎库的专业书籍,高清中文版的提供为中文读者提供了便利。这本书由Michael McCandless等作者编写,旨在帮助开发者充分利用Lucene的强大功能,构建...

    lucene in action 电子版

    - **书籍概述**:“Lucene in Action”是一本深入介绍Apache Lucene的书籍,由Otis Gospodnetic和Erik Hatcher共同撰写。该书旨在帮助读者理解和掌握如何使用Java构建高效搜索应用程序的技术细节。 - **目标读者**:...

    lucene in action

    lucene in action lucene in action lucene in action lucene in action lucene in action lucene in action lucene in action lucene in action

    lucene in action源码2

    《Lucene in Action》是关于Apache Lucene搜索引擎库的一本经典著作,这本书深入浅出地讲解了Lucene的原理和应用。源代码是学习技术书籍的精髓所在,它能让我们直观地理解书中理论的实现过程。现在我们拥有《Lucene ...

    Lucene in action 中文版

    《Lucene in Action》中文版是一本深入探讨Apache Lucene搜索引擎库的专业书籍。这本书由Michael McCandless和Erik Hatcher撰写,旨在帮助开发者理解和掌握如何利用Lucene进行全文检索和索引。中文版的发布使得更多...

    Lucene in Action 2nd Edition

    《Lucene in Action 2nd Edition》是关于Apache Lucene搜索引擎库的一本权威指南,由Manning出版社出版,于2010年6月推出了MEAP(Manning Early Access Program)新版。这本书深入浅出地介绍了如何利用Lucene进行...

    Lucene in Action英文版

    ### Lucene in Action 英文版 #### 一、理解Lucene - **定义与功能**:Lucene是一款强大的Java搜索库,它允许开发者轻松地为任何应用添加搜索功能。近年来,Lucene变得异常流行,并成为了最广泛使用的文档检索库之...

    Lucene in Action 2nd

    本书《Lucene in Action》第二版针对的是 Apache Lucene 3.0 版本,是该领域内的一部经典著作。Lucene 的主要应用场景包括但不限于: - **网站搜索**:为各种规模的网站提供快速且准确的搜索功能。 - **文档管理**...

    Lucene in action 2nd edition

    《Lucene in Action》第二版是一本全面介绍Apache Lucene 3.0的书籍,它被誉为是美国大学搜索引擎课程的标准教材之一。本书由Michael McCandless、Erik Hatcher和Otis Gospodnetic三位作者共同编写,并得到了Apache ...

    Lucene In Action

    总的来说,《Lucene In Action》是一本非常适合Java开发者和信息检索爱好者的书籍,它详尽地介绍了Lucene的功能和用法,无论你是初次接触还是希望提升Lucene应用水平,都能从中受益。通过阅读这本书,你可以掌握使用...

    lucene in action 2ed Edition

    《Lucene in Action 2nd Edition》是一本深入探讨Apache Lucene搜索引擎库的权威书籍,由Manning出版社在2010年发行。这本书详细介绍了如何利用Java编程语言来构建高性能、可扩展的全文检索应用。Lucene是Apache软件...

    Lucene in Action 配套源码

    《Lucene in Action》是一本深受开发者欢迎的书籍,它深入浅出地介绍了Apache Lucene这个全文搜索引擎库的使用和实现原理。这本书的配套源码提供了丰富的实例,帮助读者更好地理解Lucene的工作机制,同时也为实际...

    Lucene实战源码(Lucene in Action Source Code)part1

    总的来说,《Lucene实战源码(Lucene in Action Source Code)part1》是学习和掌握Lucene搜索引擎库的宝贵资源,它涵盖了从基础索引构建到复杂查询处理的多个方面,对于想要在Java应用中实现高效全文搜索的开发者来...

    lucene in action 书中例子源码

    《Lucene in Action》是一本深受开发者喜爱的书籍,它深入浅出地介绍了Apache Lucene这个全文搜索引擎库的使用和实现细节。这本书的实例代码涵盖了Lucene的核心功能和高级用法,是学习Lucene不可或缺的参考资料。...

    lucene in action源码

    《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。源码的提供使得读者可以更直观地理解Lucene的工作原理,这对于学习和开发基于Lucene的搜索应用非常有帮助。...

    Lucene In Action 2源码

    《Lucene In Action 2源码》是针对著名图书《Lucene In Action 2nd Edition》的配套代码资源,这本书是关于Apache Lucene全文搜索引擎库的一部经典之作。Lucene是一个开源的Java库,用于构建高性能、可扩展的信息...

Global site tag (gtag.js) - Google Analytics