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(); } } } } } }
相关推荐
在IT领域,Lucene是一个非常重要的开源全文搜索引擎库,它为开发者提供了强大的文本分析、索引和搜索功能。这里我们关注的是Lucene的4.4.0版本,通过解压"lucene-codecs-4.4.0.zip",我们可以深入了解其内部机制和...
7. **Lucene-Codec**: 用于编码和解码索引的底层数据结构,不同的Codec可以提供不同的性能和存储优化。 8. **Lucene-Join**: 支持跨域联接查询,允许在不同索引之间进行关联操作。 每个jar包都专注于一个特定的...
4. **分词与分析** `Analyzer`在Lucene中扮演着重要的角色,它定义了文本如何被拆解成关键词。`StandardAnalyzer`是默认的分析器,处理Unicode文本,而`SimpleAnalyzer`和`WhitespaceAnalyzer`则提供了更简单的分词...
4. **lucene-analyzers-common-6.6.0.jar**:Lucene是Elasticsearch的核心搜索库,这个JAR包含了常见的分析器,用于文本预处理,如分词、去除停用词等,以便进行有效的全文搜索。 5. **lucene-sandbox-6.6.0.jar**...
3. **Lucene-Analyzers-Common-6.6.0.jar**:Lucene的分析器模块,包含了各种预定义的文本分析器,如标准分析器、英文分析器等,用于将输入的文本拆分成可搜索的关键词。 4. **Netty-3.10.6.Final.jar**:Elastic...
`lukeall-1.0.1.jar`是Luke,一个Lucene的GUI工具,它允许开发者查看和分析Lucene索引,这对于调试和优化Lucene搜索性能非常有帮助。 `substance.jar`是外观梅花 Substance 主题包,它为Java Swing应用程序提供了...
Elasticsearch 是一个基于 Lucene 的分布式、RESTful 风格的搜索和分析引擎,广泛用于日志分析、实时数据分析、全文检索等领域。分析器(Analyzer)在 Elasticsearch 中扮演着关键角色,负责将文本分词,以便进行...
- **基本概念**:Elasticsearch 是基于Lucene的分布式搜索和分析引擎,它提供了丰富的API来处理大量的数据,支持实时的文档检索、分析和聚合。 - **Elasticsearch背后的核心理念**:Elasticsearch的核心设计理念...
- **下载插件**:将"elasticsearch-analysis-ik-7.17.10.jar"及依赖的库文件(如httpclient-4.5.13.jar、commons-codec-1.11.jar等)下载到你的Elasticsearch安装目录的`plugins`文件夹下。 - **创建子目录**:在`...
4. **elasticsearch-analysis-ik-1.4.1.jar**:ik分词器的核心组件,实现了Elasticsearch的分词分析器接口,提供对中文文本的处理。 5. **commons-logging-1.2.jar**:Apache Commons Logging库,为各种日志框架提供...
Elasticsearch是一个基于Lucene的搜索服务器,它提供了一个分布式、全文检索、实时的搜索和分析引擎。在处理中文文档时,由于中文的复杂性,需要借助分词器来将文本拆分成可索引的词汇单元。IK分词器是针对Elastic...
在使用Elasticsearch-analysis-ik插件时,用户会注意到压缩包中包含的一些核心依赖库,如httpclient-4.5.13.jar、commons-codec-1.11.jar、httpcore-4.4.13.jar等。这些库主要用于网络通信和编码解码,是Elastic...
Elasticsearch是基于Lucene的全文搜索引擎,它提供了高效的数据存储和检索能力,能够快速响应查询请求,支持大规模日志数据的实时分析。Kibana作为可视化平台,可以将Elasticsearch中的数据以图表、仪表板的形式展示...
它基于Lucene库,提供了分布式、RESTful风格的接口,支持多租户,并具备高可扩展性和高可用性。"elasticsearch-analysis-ik"是针对Elasticsearch的一个中文分词插件,主要目的是为了提升中文文本的搜索体验。 在...
- **Elasticsearch** 是一个基于 Lucene 的分布式搜索和分析引擎,它可以对日志数据进行快速存储、搜索和分析。由于其分布式特性,Elasticsearch 能够处理大量数据,并且具备高可用性和弹性伸缩性。 - **Logstash*...
"elasticsearch"是基于Lucene的开源全文搜索引擎,它提供了一个分布式、RESTful风格的搜索和数据分析引擎,适用于大数据量的索引和检索场景。IK分词器作为其插件,提升了Elasticsearch对中文文本的处理能力,使得在...
Elasticsearch(ES)是一个基于Lucene的分布式、RESTful搜索引擎,广泛应用于大数据分析、日志收集和全文检索等领域。它的核心功能包括索引、搜索、分析和聚合,但默认情况下对中文的支持并不完善,因此需要借助像IK...
1. **Elasticsearch**:Elasticsearch 是一个基于 Lucene 的分布式、RESTful 风格的搜索和数据分析引擎,广泛应用于日志分析、实时数据搜索、全文检索等领域。它提供了一个分布式、多租户的环境,具有自动发现节点、...
- `commons-codec-1.9.jar`:Apache Commons Codec 库提供了各种编码和解码算法,如 Base64 和 URL 编码。 - `commons-logging-1.2.jar`:Apache Commons Logging 是一个日志抽象层,允许在不同日志实现之间切换。...