`
donlianli
  • 浏览: 340485 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Elasticsearch...
浏览量:218592
社区版块
存档分类
最新评论

Lucene4的Version字段探索

阅读更多
在创建Lucene的IndexWriter,analyzer和QueryParser的时候都要指定一个version字段,这个version有何意义?为什么最新的版本总是把之前的version都打上deprecated标签?高版本的Lucene能否打开低版本的索引并且索引呢?
 
先看Version类本身的定义:
Use by certain classes to match version compatibility across releases of Lucene.
WARNING: When changing the version parameter that you supply to components in Lucene, do not simply change the version at search-time, but instead also adjust your indexing code to match, and re-index.
在lucene的发布的各个版本中,Version被某些类用来做兼容性检查。比如说,某些功能可能只在3.0这个版本有效,那么这个功能会先检查当前的lucene版本,如果版本等于3.0,则执行这个功能代码。
同时,注解中也说,当更改代码中的Lucene版本号时,不能光修改搜索时使用的版本号,并且必须将索引时的版本号也改掉,同时重建索引。也就是说,搜索时用的版本号和索引时使用的版本号必须相同。
 

看IndexWriterConfig的构造方法注释:
Creates a new config that with defaults that match the specified Version as well as the default Analyzer. If matchVersion is >= Version.LUCENE_32, TieredMergePolicy is used for merging; else LogByteSizeMergePolicy. Note that TieredMergePolicy is free to select non-contiguous merges, which means docIDs may not remain monotonic over time. If this is a problem you should switch to LogByteSizeMergePolicy or LogDocMergePolicy.
这段注释告诉我们,如果Lucene的版本大于Lucene_32,将使用TieredMergePolicy,否则将使用LogByteSizePolicy。使用不同的版本,将导致lucene采用不同的合并策略。
 
再看StandardAnalyzer

You must specify the required Version compatibility when creating StandardTokenizer:

  • As of 3.4, Hiragana and Han characters are no longer wrongly split from their combining characters. If you use a previous version number, you get the exact broken behavior for backwards compatibility.
  • As of 3.1, StandardTokenizer implements Unicode text segmentation. If you use a previous version number, you get the exact behavior ofClassicTokenizer for backwards compatibility.
这句话,不知道我理解的对不对,就是说在3.4的版本之前,会将汉字错误的分词。如果你在新的Lucene4中现在仍然使用3.4之前的版本,那么你还会有这样的bug。
我们在Lucene的源码中能找到很多类似这样的代码:
StandardFilter类
if (matchVersion.onOrAfter(Version.LUCENE_31))
      return input.incrementToken(); // TODO: add some niceties for the new grammar
    else
      return incrementTokenClassic();
 
特别是分词包中。
 
那么,低版本的索引文件,在高版本中是否可以使用呢,经过测试,高版本肯定能够做到读取和搜索,因此可以断定,高版本肯定能过兼容低版本的数据,甚至大版本号都不一样。
 
结论:
因此总结来说,在使用Lucene时,我们只遵循一个原则,只使用最新的版本,如果变更版本,需要重建索引。在老的版本你无法使用新的版本号,在新的版本中,你不要使用老的版本号。Lucene版本号主要作用是Lucene自己对索引的某些特性做的一些向下兼容,如果你想使用一个较老的版本,某些特性还是可以使用的,只是新的版本不再提供这些特性。
 
 
 
请支持原创:

http://donlianli.iteye.com/blog/1976920

 

 

 

 

 

对这类话题感兴趣?欢迎发送邮件至donlianli@126.com
关于我:邯郸人,擅长Java,Javascript,Extjs,oracle sql。
更多我之前的文章,可以访问 我的空间
1
0
分享到:
评论

相关推荐

    lucene使用教程

    <lucene-version>5.3.1</lucene-version> <groupId>org.apache.lucene <artifactId>lucene-core <version>${lucene-version}</version> <groupId>org.apache.lucene <artifactId>lucene-queryparser ...

    Lucene建立索引及查询包含“java”关键字 示例代码

    5. **创建Document对象并添加字段**:每个Document代表一个要索引的记录,字段(Field)是Document的组成部分,如"content"字段用于存储文本内容。 6. **添加Document到索引**:使用IndexWriter的addDocument方法。...

    lucene5.X与lucene3.60的版本差异

    4. Lucene-5127:删除了`IndexWriterConfig`中的`setTermIndexInterval`、`setReaderTermsIndexDivisor`和`TermsIndexDivisor`,以减少内存使用。术语索引间隔的配置应直接传递给编解码器,或者针对每个字段进行设置...

    lucene 分组统计

    StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); PerFieldAnalyzerWrapper perFieldAnalyzer = new PerFieldAnalyzerWrapper(analyzer); perFieldAnalyzer.addAnalyzer("mm", new MMAnalyzer...

    Lucene3.0创建索引

    IndexWriter indexWriter = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED); // 获取所有待索引的文件列表 File[] files = new File(dateDir).list...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-06.Lucene索引搜索 共13页.pptx

    - **Term**:是Lucene中表示搜索基本单位的对象,包含字段名和字段值。Term用于创建TermQuery,例如`new Term("fieldName", "queryWord")`,表示在"fieldName"字段中查找"queryWord"。 3. **搜索方法**: - `...

    lucene 3.4基本应用

    通过建立索引,搜索性能大大提高,因为Lucene可以跳过对非索引字段的扫描,直接定位到相关的文档。此外,通过使用不同的分析器,Lucene还支持多种语言的搜索,具备强大的模糊匹配和近似搜索能力。 ### 五、学习资源...

    Lucene索引的基本操作

    ### 4. 创建索引writer `IndexWriter`负责处理索引的写入操作: ```java IndexWriterConfig config = new IndexWriterConfig(analyzer); config.setOpenMode(OpenMode.CREATE_OR_APPEND); // 如果索引不存在则创建...

    Lucene.Net实现全文搜索

    Query q = new QueryParser(Version.LUCENE_29, "content", new StandardAnalyzer(Version.LUCENE_29)).Parse(query); TopDocs hits = searcher.Search(q, 10); // 返回前10个结果 foreach (ScoreDoc scoreDoc ...

    Lucenedemo

    1. 定义字段类型:Lucene中的每个字段都有一个类型,如TextField用于全文检索,KeywordField用于精确匹配等。 2. 创建Analyzer:Analyzer负责对输入文本进行分词,可以自定义分词规则。 3. 创建IndexWriterConfig:...

    lucene个人总结

    - **设置 `IndexWriterConfig`**:配置 `IndexWriter` 的行为,如版本控制(`Version.LUCENE_35`)、分词器及写入模式(`OpenMode.CREATE_OR_APPEND`)。 2. **添加文档到索引** - 创建 `Document` 对象并填充...

    lucene3.6的入门案例

    - 使用 QueryParser 创建 Query 对象,例如 `Query query = new QueryParser(Version.LUCENE_36, "content", analyzer).parse(queryStr);` - 创建 IndexSearcher 并打开索引。 - 使用 Searcher 执行查询并获取 ...

    在HDFS上使用Lucene的SourceCode

    QueryParser parser = new QueryParser(Version.LUCENE_24, "date", analyzer); Query query = parser.parse("2010-04-21"); TopDocs topDocs = searcher.search(query, 10); // 返回前10个匹配结果 ``` 一旦我们在...

    lucene简单代码列子

    这个查询会搜索"内容"字段中包含"Lucene 简单 代码"的文档,并打印出匹配的文档标题和内容。 总结来说,Lucene通过创建索引、添加文档、解析查询和执行搜索来实现全文检索。在这个简单的例子中,我们使用了...

    Lucene.Net 文件检索doc,xls,ppt,txt,pdf文件(实例)

    5. **用户查询**: 用户输入查询后,使用QueryParser创建查询对象,如`Query query = new QueryParser(Version.LUCENE_30, "content", analyzer).Parse(queryString)`。 6. **执行搜索**: 使用`IndexSearcher.Search...

    lucene 2.1.0 好用实例

    - 使用`QueryParser`解析查询字符串,`Query query = new QueryParser(Version.LUCENE_21, "content", analyzer).parse(queryString);` - 初始化`IndexSearcher`,执行查询,`TopDocs topDocs = searcher.search...

    Lucene之Helloworld

    这只是Lucene功能的冰山一角,更高级的应用包括多字段索引、模糊查询、排序、高亮显示、分页检索等。在实际项目中,你可能需要结合实际需求,选择合适的存储方式(如磁盘目录或文件系统),以及优化分析器以适应特定...

    lucene学习笔记

    QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "content", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29)); Query query = parser.Parse("测试"); TopDocs hits = ...

    lucene 简单例子

    **Lucene 简单例子** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会开发。它提供了一个可扩展的、高性能的搜索框架,使得开发者能够在他们的应用程序中轻松地实现全文检索功能。本例子将介绍如何使用 ...

Global site tag (gtag.js) - Google Analytics