`
fwuwen
  • 浏览: 16256 次
  • 来自: 厦门
文章分类
社区版块
存档分类
最新评论

lucene4 codec分析

 
阅读更多

 

lucene4的一个很大的变化就是提供了可插拔的编码器架构,可以自行定义索引结构,包括词元,倒排列表,存储字段,词向量,已删除的文档,段信息,字段信息

 

关于codec:

lucene4中已经提供了多个codec的实现

Lucene40, 默认编码器.Lucene40Codec

Lucene3x, read-only, 可以用来读取采用3.x创建的索引,不能使用该编码器创建索引.Lucene3xCodec

SimpleText, 采用明文的方式存储索引,适合用来学习,不建议在生产环境中使用. SimpleTextCodec

Appending, 针对采用append写入的文件系统,例如hdfs. AppendingCodec

......

 

关于format:

codec事实上就是有多组的format构成的,一个codec总共包含8个format,

包含PostingsFormat,DocValuesFormat,StoredFieldsFormat,TermVectorsFormat,FieldInfosFormat,SegmentInfoFormat,NormsFormat,LiveDocsFormat

例StoredFieldsFormat用来处理stored fileds,TermVectorsFormat用来处理term vectors。在lucene4中可以自行定制各个format的实现

 

目前在lucene4中也提供了多个PostingsFormat的实现

Memory:将所有的term和postinglists加载到一个内存中的FST. MemoryPostingsFormat

Direct:写的时候采用默认的Lucene40PostingsFormat,读的时候在将terms和postinglists加载到内存里面.DirectPostingsFormat

Pulsing:默认将词频小于等于1的term采用inline的方式存储.PulsingPostingsFormat

BloomFilter:可以在每个segment上为某个指定的field添加Bloom Filter.实现了"fast-fail"来判断segment上有没有相对应的key。最适合的场景就是在索引的记录数很多,同时segment也很多的情况下为主键添加Bloom Filter。BloomFilteringPostingsFormat需实现在其他的PostingsFormat之上.这里有个关于BloomFilter的测试https://docs.google.com/spreadsheet/ccc?key=0AsKVSn5SGg_wdFNpNTl3R1cxLTluTTcya2hDRnlfdHc#gid=3

Block:提供了索引的压缩同时也加强了检索性能,在未来的版本中可能会变成默认的PostingsFormat。现在要使用此格式的同学得注意,目前这个版本还处在实验阶段,并不能保证索引格式的向后兼容。和Lucene40不同的是BlockPostingsFormat不会创建 .frq和.prx取而代之的是.doc和.pos文件

....

 

测试代码:

package test;

import java.io.File;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.UUID;  
  
import org.apache.lucene.analysis.Analyzer;  
import org.apache.lucene.analysis.cjk.CJKAnalyzer;  
import org.apache.lucene.codecs.Codec;  
import org.apache.lucene.codecs.PostingsFormat;  
import org.apache.lucene.codecs.appending.AppendingCodec;  
import org.apache.lucene.codecs.bloom.BloomFilteringPostingsFormat;  
import org.apache.lucene.codecs.lucene3x.Lucene3xCodec;  
import org.apache.lucene.codecs.lucene40.Lucene40Codec;  
import org.apache.lucene.codecs.lucene40.Lucene40PostingsFormat;  
import org.apache.lucene.codecs.simpletext.SimpleTextCodec;  
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.store.Directory;  
import org.apache.lucene.store.FSDirectory;  
import org.apache.lucene.util.Version;  
  
/** 
 * lucene codec 
 *  
 * @author wuwen 
 * @date 2013-1-14 下午04:54:17 
 *  
 */  
public class LuceneCodecTest {  
  
    static Codec getCodec(String codecname) {  
        Codec codec = null;  
        if ("Lucene40".equals(codecname)) {  
            codec = new Lucene40Codec();  
        } else if ("Lucene3x".equals(codecname)) {  
            codec = new Lucene3xCodec();  
//          throw new UnsupportedOperationException("this codec can only be used for reading");  
        }  
        else if ("SimpleText".equals(codecname)) {  
            codec = new SimpleTextCodec();  
        } else if ("Appending".equals(codecname)) {  
            codec = new AppendingCodec();  
        } else if ("Pulsing40".equals(codecname)) {  
             codec = new Lucene40Codec() {  
                  public PostingsFormat getPostingsFormatForField(String field) {  
                      return PostingsFormat.forName("Pulsing40");  
                  }  
             };  
        } else if ("Memory".equals(codecname)) {  
             codec = new Lucene40Codec() {  
                  public PostingsFormat getPostingsFormatForField(String field) {  
                      return PostingsFormat.forName("Memory");  
                  }  
             };  
        } else if ("BloomFilter".equals(codecname)) {  
             codec = new Lucene40Codec() {  
                  public PostingsFormat getPostingsFormatForField(String field) {  
                      return new BloomFilteringPostingsFormat(new Lucene40PostingsFormat());  
                  }  
             };  
        }else if ("Direct".equals(codecname)) {  
             codec = new Lucene40Codec() {  
                  public PostingsFormat getPostingsFormatForField(String field) {  
                      return PostingsFormat.forName("Direct");  
                  }  
             };  
        } else if ("Block".equals(codecname)) {  
             codec = new Lucene40Codec() {  
                  public PostingsFormat getPostingsFormatForField(String field) {  
                      return PostingsFormat.forName("Block");  
                  }  
             };  
        }  
        return codec;  
    }  
      
    public static void main(String[] args) {  
        String[] codecs = {"Lucene40", "Lucene3x", "SimpleText", "Appending", "Pulsing40", "Memory", "BloomFilter", "Direct", "Block"};  
        String suffixPath = "E:\\lucene\\codec\\";  
        for (String codecname : codecs) {  
            String indexPath = suffixPath + codecname;  
            Codec codec = getCodec(codecname);  
            Analyzer analyzer = new CJKAnalyzer(Version.LUCENE_40);  
            IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, analyzer);  
            config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);  
            config.setCodec(codec);     // 设置编码器  
            IndexWriter writer = null;  
            try {  
                Directory luceneDir = FSDirectory.open(new File(indexPath));  
                writer = new IndexWriter(luceneDir, config);  
                List<Document> list = new ArrayList<Document>();  
                
                Document doc = new Document();  
                doc.add(new StringField("GUID", UUID.randomUUID().toString(), Field.Store.YES));  
                doc.add(new TextField("Content", "北京时间1月14日04:00(西班牙当地时间13日21:00),2012/13赛季西班牙足球甲级联赛第19轮一场焦点战在纳瓦拉国王球场展开争夺.", Field.Store.YES));
                list.add(doc);  
                
                Document doc1 = new Document();  
                doc1.add(new StringField("GUID", UUID.randomUUID().toString(), Field.Store.YES));  
                doc1.add(new TextField("Content", "巴萨超皇马18分毁了西甲?媒体惊呼 克鲁伊夫看不下去.", Field.Store.YES));
                list.add(doc1);  
                
                Document doc2 = new Document();  
                doc2.add(new StringField("GUID", UUID.randomUUID().toString(), Field.Store.YES));  
                doc2.add(new TextField("Content", "what changes in lucene4.", Field.Store.YES));  
                list.add(doc2);  
  
                writer.addDocuments(list);  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {  
                if (writer != null) {  
                    try {  
                        writer.close();  
                    } catch (Exception e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
              
        }  
    }  
}  

 

分享到:
评论

相关推荐

    lucene-codecs-4.4.0.zip

    在IT领域,Lucene是一个非常重要的开源全文搜索引擎库,它为开发者提供了强大的文本分析、索引和搜索功能。这里我们关注的是Lucene的4.4.0版本,通过解压"lucene-codecs-4.4.0.zip",我们可以深入了解其内部机制和...

    lucene 最新版本所有jar包

    7. **Lucene-Codec**: 用于编码和解码索引的底层数据结构,不同的Codec可以提供不同的性能和存储优化。 8. **Lucene-Join**: 支持跨域联接查询,允许在不同索引之间进行关联操作。 每个jar包都专注于一个特定的...

    lucene4.10.4源码包

    4. **分词与分析** `Analyzer`在Lucene中扮演着重要的角色,它定义了文本如何被拆解成关键词。`StandardAnalyzer`是默认的分析器,处理Unicode文本,而`SimpleAnalyzer`和`WhitespaceAnalyzer`则提供了更简单的分词...

    elasticsearch所需jar包

    4. **lucene-analyzers-common-6.6.0.jar**:Lucene是Elasticsearch的核心搜索库,这个JAR包含了常见的分析器,用于文本预处理,如分词、去除停用词等,以便进行有效的全文搜索。 5. **lucene-sandbox-6.6.0.jar**...

    elasticsearch5.5.1客户端所需jar包,解决必须用maven工程问题

    3. **Lucene-Analyzers-Common-6.6.0.jar**:Lucene的分析器模块,包含了各种预定义的文本分析器,如标准分析器、英文分析器等,用于将输入的文本拆分成可搜索的关键词。 4. **Netty-3.10.6.Final.jar**:Elastic...

    很多java 包 很实用 以及一个UML建模工具

    `lukeall-1.0.1.jar`是Luke,一个Lucene的GUI工具,它允许开发者查看和分析Lucene索引,这对于调试和优化Lucene搜索性能非常有帮助。 `substance.jar`是外观梅花 Substance 主题包,它为Java Swing应用程序提供了...

    最新版 elasticsearch-analysis-ik-7.9.0.zip

    Elasticsearch 是一个基于 Lucene 的分布式、RESTful 风格的搜索和分析引擎,广泛用于日志分析、实时数据分析、全文检索等领域。分析器(Analyzer)在 Elasticsearch 中扮演着关键角色,负责将文本分词,以便进行...

    Mastering Elasticsearch(中文版).pdf

    - **基本概念**:Elasticsearch 是基于Lucene的分布式搜索和分析引擎,它提供了丰富的API来处理大量的数据,支持实时的文档检索、分析和聚合。 - **Elasticsearch背后的核心理念**:Elasticsearch的核心设计理念...

    elasticsearch7.17.10版本分词器插件安装包

    - **下载插件**:将"elasticsearch-analysis-ik-7.17.10.jar"及依赖的库文件(如httpclient-4.5.13.jar、commons-codec-1.11.jar等)下载到你的Elasticsearch安装目录的`plugins`文件夹下。 - **创建子目录**:在`...

    ik分词器1.4.1版本(可直接使用)

    4. **elasticsearch-analysis-ik-1.4.1.jar**:ik分词器的核心组件,实现了Elasticsearch的分词分析器接口,提供对中文文本的处理。 5. **commons-logging-1.2.jar**:Apache Commons Logging库,为各种日志框架提供...

    elasticsearch7.17.13版本分词器插件安装包

    Elasticsearch是一个基于Lucene的搜索服务器,它提供了一个分布式、全文检索、实时的搜索和分析引擎。在处理中文文档时,由于中文的复杂性,需要借助分词器来将文本拆分成可索引的词汇单元。IK分词器是针对Elastic...

    elasticsearch-analysis-ik 8.11.3 分词器

    在使用Elasticsearch-analysis-ik插件时,用户会注意到压缩包中包含的一些核心依赖库,如httpclient-4.5.13.jar、commons-codec-1.11.jar、httpcore-4.4.13.jar等。这些库主要用于网络通信和编码解码,是Elastic...

    基于ELK Stack 和 Spark Streaming 的日志处理平台.pdf

    Elasticsearch是基于Lucene的全文搜索引擎,它提供了高效的数据存储和检索能力,能够快速响应查询请求,支持大规模日志数据的实时分析。Kibana作为可视化平台,可以将Elasticsearch中的数据以图表、仪表板的形式展示...

    elasticsearch-analysis-ik-6.3.0.zip

    它基于Lucene库,提供了分布式、RESTful风格的接口,支持多租户,并具备高可扩展性和高可用性。"elasticsearch-analysis-ik"是针对Elasticsearch的一个中文分词插件,主要目的是为了提升中文文本的搜索体验。 在...

    预习资料-ELK入门及集群搭建1

    - **Elasticsearch** 是一个基于 Lucene 的分布式搜索和分析引擎,它可以对日志数据进行快速存储、搜索和分析。由于其分布式特性,Elasticsearch 能够处理大量数据,并且具备高可用性和弹性伸缩性。 - **Logstash*...

    elasticsearch-analysis-ik-7.4.0.zip

    "elasticsearch"是基于Lucene的开源全文搜索引擎,它提供了一个分布式、RESTful风格的搜索和数据分析引擎,适用于大数据量的索引和检索场景。IK分词器作为其插件,提升了Elasticsearch对中文文本的处理能力,使得在...

    elasticsearch-analysis-ik-7.6.1.zip

    Elasticsearch(ES)是一个基于Lucene的分布式、RESTful搜索引擎,广泛应用于大数据分析、日志收集和全文检索等领域。它的核心功能包括索引、搜索、分析和聚合,但默认情况下对中文的支持并不完善,因此需要借助像IK...

    最新版 elasticsearch-analysis-ik-8.4.0.zip

    1. **Elasticsearch**:Elasticsearch 是一个基于 Lucene 的分布式、RESTful 风格的搜索和数据分析引擎,广泛应用于日志分析、实时数据搜索、全文检索等领域。它提供了一个分布式、多租户的环境,具有自动发现节点、...

    最新版 elasticsearch-analysis-ik-6.8.9.zip

    - `commons-codec-1.9.jar`:Apache Commons Codec 库提供了各种编码和解码算法,如 Base64 和 URL 编码。 - `commons-logging-1.2.jar`:Apache Commons Logging 是一个日志抽象层,允许在不同日志实现之间切换。...

Global site tag (gtag.js) - Google Analytics