`
imjl
  • 浏览: 156583 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[zz]lucene index 包分析

阅读更多
Index包分析

转载自http://www.gamvan.com/club/clubPage.jsp?ccStyle=0&tID=10633&ccID=37

Lucene索引中有几个最基础的概念,索引(index),文档(document),域(field),和项(或者译为语词term)

其中Index为Document的序列   Document为Field的序列  Field为Term的序列

Term就是一个子串.存在于不同的Field中的同一个子串被认为是不同的Term.因此Term实际上是用一对子串表示的,第一个子串为Field的name,第二个为Field中的子串.既然Term这么重要,我们先来认识一下Term.

认识Term最好的方法就是看其源码表示.
public final class Term implements Comparable, java.io.Serializable {
  String field;
  String text;
  public Term(String fld, String txt) {this(fld, txt, true);}
  public final String field() { return field; }
  public final String text() { return text; }
  //overwrite equals()
  public final boolean equals(Object o) { }
  //overwrite hashCode()
  public final int hashCode() {r
       return field.hashCode() + text.hashCode();
  }
  public int compareTo(Object other) {
      return compareTo((Term)other);
  }
  public final int compareTo(Term other)
  final void set(String fld, String txt)  public final String toString() {
         return field + ":" + text; 
  }
  private void readObject(java.io.ObjectInputStream in){

  }
从代码中我们可以大体看出Tern其实是一个二元组
分享到:
评论
1 楼 imjl 2007-02-21  
下边来编制一个程序来结束本章的讨论。
程序代码:
package org.apache.lucene.index;
import org.apache.lucene.analysis.*;
import org.apache.lucene.analysis.standard.*;
import org.apache.lucene.store.*;
import org.apache.lucene.document.*;
import org.apache.lucene.demo.*;
import org.apache.lucene.search.*;
import java.io.*;
/**在使用此程序时,会尽量用到Lucene Index中的每一个类,尽量将其展示个大家
*使用的Index包中类有
*document.riter(提供给用用户使用的为IndexWriter)
*FieldInfo(和FieldInfos)
* SegmentDocs(扩展自TermDocs)
*SegmentReader(扩展自IndexReader,提供给用户使用的是IndexReader)
*SegmentMerger
*segmentTermEnum(扩展自TermEnum)
*segmentTermPositions(扩展自TermPositions)
*segmentTermVector(扩展自TermFreqVector)
*/

public class TestIndexpackage{
  //用于将document.入索引
public static void indexdocument.String segment,String fileName)
throws Exception
{
//第二个参数用来控制,如果获得不了目录是否创建
Directory directory = FSDirectory.getDirectory("testIndexpackage",false);
  Analyzer analyzer = new SimpleAnalyzer();
  //第三个参数为每一个Field最多拥有的Token个数
document.riter writer = new document.riter(directory,analyzer,Similarity.getDefault(),1000);
  File file = new File(fileName);
//由于使用Filedocument.file包装成了Docuement,会在document.创建三个field(path,modified,contents)
document.nbsp;doc = Filedocument.document.file);
  writer.adddocument.segment,doc);
  directory.close();
  }
  //将多个segment进行合并
public static void merge(String segment1,String segment2,String segmentMerged)throws Exception  {
  Directory directory = FSDirectory.getDirectory("testIndexpackage",false);
  SegmentReader segmentReader1=new SegmentReader(new SegmentInfo(segment1,1,directory));
  SegmentReader segmentReader2=new SegmentReader(new SegmentInfo(segment2,1,directory));
  //第三个参数为是否创建.cfs文件
SegmentMerger segmentMerger =new SegmentMerger(directory,segmentMerged,false);
segmentMerger.add(segmentReader1);
segmentMerger.add(segmentReader2);
segmentMerger.merge();
segmentMerger.closeReaders();
directory.close();
}
//将segment即Index的子索引的所有内容展示给你看。
public static void printSegment(String segment) throws Exception
{
Directory directory =FSDirectory.getDirectory("testIndexpackage",false);
SegmentReader segmentReader = new SegmentReader(new SegmentInfo(segment,1,directory));
//display document.
for(int i=0;i<segmentReader.numDocs();i++)
System.out.println(segmentReader.document.i));
TermEnum termEnum = segmentReader.terms();//此处实际为SegmentTermEnum
//display term and term positions,termDocs
while(termEnum.next()){
System.out.print(termEnum.term().toString2());
System.out.println(" document.requency=" + termEnum.docFreq());
TermPositions termPositions= segmentReader.termPositions(termEnum.term());
int i=0;
while(termPositions.next()) {
System.out.println((i++)+"->"+termPositions);
}
TermDocs termDocs=segmentReader.termDocs(termEnum.term());//实际为segmentDocs
while (termDocs.next())
{
System.out.println((i++)+"->"+termDocs);
}
}
//display field info
FieldInfos fieldInfos= segmentReader.fieldInfos;
FieldInfo pathFieldInfo = fieldInfos.fieldInfo("path");
FieldInfo modifiedFieldInfo = fieldInfos.fieldInfo("modified");
FieldInfo contentsFieldInfo =fieldInfos.fieldInfo("contents");
System.out.println(pathFieldInfo);
System.out.println(modifiedFieldInfo);
System.out.println(contentsFieldInfo);
//display TermFreqVector
for(int i=0;i<segmentReader.numDocs();i++){
//对contents的token之后的term存于了TermFreqVector
TermFreqVector termFreqVector=segmentReader.getTermFreqVector(i,"contents");
System.out.println(termFreqVector);
}
}

public static void main(String [] args){
try{
Directory directory = FSDirectory.getDirectory("testIndexpackage",true);
directory.close();
indexdocument."segmentOne","e:\\lucene\\test.txt");
//printSegment("segmentOne");
indexdocument."segmentTwo","e:\\lucene\\test2.txt");
// printSegment("segmentTwo");
merge("segmentOne","segmentTwo","merge");
printSegment("merge");
}catch(Exception e){
System.out.println("caught a "+e.getCause()+"\n with message:"+e.getMessage());
e.printStackTrace();
}
}
}


看看其结果如下:
程序代码:
document.lt;Text<path:e:\lucene\test.txt> Keyword<modified:0eg4e221c>>
document.lt;Text<path:e:\lucene\test2.txt> Keyword<modified:0eg4ee8b4>>
<Term:FieldName,text>=<contents,china> document.requency=1
0-><doc,TermFrequency,Pos>:< doc=0, TermFrequency=1 Pos=2>
1-><docNumber,freq>=<0,1>
<Term:FieldName,text>=<contents,i> document.requency=2
0-><doc,TermFrequency,Pos>:< doc=0, TermFrequency=2 Pos=0,3>
1-><doc,TermFrequency,Pos>:< doc=1, TermFrequency=1 Pos=0>
2-><docNumber,freq>=<0,2>
3-><docNumber,freq>=<1,1>
<Term:FieldName,text>=<contents,love> document.requency=2
0-><doc,TermFrequency,Pos>:< doc=0, TermFrequency=2 Pos=1,4>
1-><doc,TermFrequency,Pos>:< doc=1, TermFrequency=1 Pos=1>
2-><docNumber,freq>=<0,2>
3-><docNumber,freq>=<1,1>
<Term:FieldName,text>=<contents,nankai> document.requency=1
0-><doc,TermFrequency,Pos>:< doc=1, TermFrequency=1 Pos=2>
1-><docNumber,freq>=<1,1>
<Term:FieldName,text>=<contents,tianjin> document.requency=1
0-><doc,TermFrequency,Pos>:< doc=0, TermFrequency=1 Pos=5>
1-><docNumber,freq>=<0,1>
<Term:FieldName,text>=<modified,0eg4e221c> document.requency=1
0-><doc,TermFrequency,Pos>:< doc=0, TermFrequency=1 Pos=0>
1-><docNumber,freq>=<0,1>
<Term:FieldName,text>=<modified,0eg4ee8b4> document.requency=1
0-><doc,TermFrequency,Pos>:< doc=1, TermFrequency=1 Pos=0>
1-><docNumber,freq>=<1,1>
<Term:FieldName,text>=<path,e> document.requency=2
0-><doc,TermFrequency,Pos>:< doc=0, TermFrequency=1 Pos=0>
1-><doc,TermFrequency,Pos>:< doc=1, TermFrequency=1 Pos=0>
2-><docNumber,freq>=<0,1>
3-><docNumber,freq>=<1,1>
<Term:FieldName,text>=<path,lucene> document.requency=2
0-><doc,TermFrequency,Pos>:< doc=0, TermFrequency=1 Pos=1>
1-><doc,TermFrequency,Pos>:< doc=1, TermFrequency=1 Pos=1>
2-><docNumber,freq>=<0,1>
3-><docNumber,freq>=<1,1>
<Term:FieldName,text>=<path,test> document.requency=2
0-><doc,TermFrequency,Pos>:< doc=0, TermFrequency=1 Pos=2>
1-><doc,TermFrequency,Pos>:< doc=1, TermFrequency=1 Pos=2>
2-><docNumber,freq>=<0,1>
3-><docNumber,freq>=<1,1>
<Term:FieldName,text>=<path,txt> document.requency=2
0-><doc,TermFrequency,Pos>:< doc=0, TermFrequency=1 Pos=3>
1-><doc,TermFrequency,Pos>:< doc=1, TermFrequency=1 Pos=3>
2-><docNumber,freq>=<0,1>
3-><docNumber,freq>=<1,1>

<fieldName,isIndexed,fieldNumber,storeTermVector>=path,true,3,false>
<fieldName,isIndexed,fieldNumber,storeTermVector>=modified,true,2,false>
<fieldName,isIndexed,fieldNumber,storeTermVector>=contents,true,1,true>
{contents: china/1, i/2, love/2, tianjin/1}
{contents: i/1, love/1, nankai/1}

认真审视其结果,你就会更加明白Lucene底层的索引结构如何。

相关推荐

    lucene3源码分析

    ### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...

    Luke-Lucene Index Toolbox

    **Luke-Lucene Index Toolbox** Luke是一款强大的开源工具,专门用于浏览和分析Apache Lucene的索引。Lucene是Java开发的全文搜索引擎库,被广泛应用于各种搜索应用中,包括网站搜索、文档检索、数据挖掘等领域。...

    lucene jar包

    Lucene的核心特性包括文本分析、索引构建、查询解析、排序以及结果评分等,它为开发者提供了强大的文本搜索能力,极大地简化了开发过程。 1. **文本分析**:Lucene内置了多种语言的分词器,能够对输入的文本进行...

    lucene所有的jar包

    1. **core jar包**:这是Lucene的基础模块,包含索引、搜索、分析等核心功能。在4.9.0版本中,主要的jar包有`lucene-core-4.9.0.jar`,它是所有其他模块的基础。 2. **analyzers jar包**:用于文本分析,将输入的...

    luck 查看lucene index的利器

    用来查看lucene index的工具 分析index的结构。下载解压后直接点击运行即可!

    lucene 所有jar包 包含IKAnalyzer分词器

    `lucene-analyzers-3.6.1.jar`则包含了各种分析器,用于对输入文本进行预处理,包括分词、去除停用词、词形还原等。这些分析器是搜索引擎处理文本数据的关键,它们确保了搜索的准确性和效率。 接下来,我们要讨论的...

    lucene完整包,所有的包都有,非常全的

    这个“lucene完整包”包含了 Lucene 的所有组件和相关库,确保用户能够获得全面的功能支持。Lucene 提供了高效的文本检索和分析功能,广泛应用于网站搜索、文档检索、数据挖掘等领域。 在 Lucene 的核心设计中,它...

    lucene相关jar+查询分析器jar

    总结,"lucene相关jar+查询分析器jar"是一个包含了Lucene库以及可能特定查询分析器的集合,它为开发者提供了构建高效全文搜索功能的基础。通过理解Lucene的工作原理,掌握查询分析器的使用,以及灵活地调整和优化,...

    lucene 全包 包括源码

    Lucene 的源码分为几个主要部分,包括分析(Analyzer)、索引(Index)、查询(Query)、搜索(Search)和文档处理(Document)。这些模块共同构成了Lucene的基本架构。 1. 分析(Analyzer):Analyzer是处理文本...

    Lucene开发包

    **Lucene 开发包详解** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。这个开发包包含了两个版本:lucene-1.4.3 和 lucene-1.4.1,分别代表了 Lucene 的不同迭代阶段,它们为开发者提供了...

    lucene_jar包

    - **倒排索引(Inverted Index)**: 倒排索引是Lucene的主要数据结构,它将每个术语映射到包含该术语的文档集合,使得搜索变得高效。 **3. 使用Lucene的步骤** 1. 创建索引:首先,你需要实例化一个IndexWriter对象...

    Lucene3.5源码jar包

    10. **性能调优**:通过分析源码,开发者可以了解到如何调整各种参数,如缓存大小、合并策略等,来优化Lucene的性能。 总的来说,深入学习Lucene 3.5.0的源码,可以帮助开发者掌握全文检索的核心技术,了解其内部...

    lucene in action英文版 lucene 3.30包

    "Lucene的- 3.0.3.zip.ZIP"可能是Lucene 3.0.3版本的源码或二进制包,可供开发者下载研究和使用。 总之,Lucene是一个强大的搜索工具,通过学习《Lucene in Action》并实践使用Lucene 3.30,开发者能够构建高效、...

    lucene的jar包,欢迎下载

    【标题】"lucene的jar包,欢迎下载"所涉及的知识点主要集中在Lucene这个开源全文搜索引擎库上。Lucene是Apache软件基金会的顶级项目,它是一个高性能、全文本搜索库,提供了完整的搜索功能,包括索引、查询、排序等...

    lucene相关十几个包

    3. **lucene-analyzers-smartcn-5.3.0.jar**:这个JAR文件提供了对中文智能分析的支持,SmartChineseAnalyzer是针对中文文本处理的分析器,能有效处理中文分词和词性标注问题。 4. **lucene-core-4.6.0.jar**:这是...

    lucene-highlighter-3.5.0.jar lucene高亮包

    lucene-highlighter-3.5.0.jar lucene高亮包

    工具包Lucene2.4.1

    在此次提供的"工具包Lucene2.4.1"中,我们聚焦于这个相对较新的版本(相对于发布时)的特性、功能和使用方法。 **一、Lucene简介** Lucene的核心功能是实现文本的索引和搜索,它提供了一个高级的、灵活的、可扩展的...

    lucene-4.7.0全套jar包

    【Lucene 4.7.0 全套JAR包详解】 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高级、灵活的文本搜索API,允许开发者轻松地在应用程序中实现复杂的搜索功能。这次提供的“lucene-...

Global site tag (gtag.js) - Google Analytics