在创建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 of
ClassicTokenizer
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。
更多我之前的文章,可以访问 我的空间
相关推荐
<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 ...
5. **创建Document对象并添加字段**:每个Document代表一个要索引的记录,字段(Field)是Document的组成部分,如"content"字段用于存储文本内容。 6. **添加Document到索引**:使用IndexWriter的addDocument方法。...
4. Lucene-5127:删除了`IndexWriterConfig`中的`setTermIndexInterval`、`setReaderTermsIndexDivisor`和`TermsIndexDivisor`,以减少内存使用。术语索引间隔的配置应直接传递给编解码器,或者针对每个字段进行设置...
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); PerFieldAnalyzerWrapper perFieldAnalyzer = new PerFieldAnalyzerWrapper(analyzer); perFieldAnalyzer.addAnalyzer("mm", new MMAnalyzer...
IndexWriter indexWriter = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED); // 获取所有待索引的文件列表 File[] files = new File(dateDir).list...
- **Term**:是Lucene中表示搜索基本单位的对象,包含字段名和字段值。Term用于创建TermQuery,例如`new Term("fieldName", "queryWord")`,表示在"fieldName"字段中查找"queryWord"。 3. **搜索方法**: - `...
通过建立索引,搜索性能大大提高,因为Lucene可以跳过对非索引字段的扫描,直接定位到相关的文档。此外,通过使用不同的分析器,Lucene还支持多种语言的搜索,具备强大的模糊匹配和近似搜索能力。 ### 五、学习资源...
### 4. 创建索引writer `IndexWriter`负责处理索引的写入操作: ```java IndexWriterConfig config = new IndexWriterConfig(analyzer); config.setOpenMode(OpenMode.CREATE_OR_APPEND); // 如果索引不存在则创建...
1. 定义字段类型:Lucene中的每个字段都有一个类型,如TextField用于全文检索,KeywordField用于精确匹配等。 2. 创建Analyzer:Analyzer负责对输入文本进行分词,可以自定义分词规则。 3. 创建IndexWriterConfig:...
- **设置 `IndexWriterConfig`**:配置 `IndexWriter` 的行为,如版本控制(`Version.LUCENE_35`)、分词器及写入模式(`OpenMode.CREATE_OR_APPEND`)。 2. **添加文档到索引** - 创建 `Document` 对象并填充...
- 使用 QueryParser 创建 Query 对象,例如 `Query query = new QueryParser(Version.LUCENE_36, "content", analyzer).parse(queryStr);` - 创建 IndexSearcher 并打开索引。 - 使用 Searcher 执行查询并获取 ...
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通过创建索引、添加文档、解析查询和执行搜索来实现全文检索。在这个简单的例子中,我们使用了...
5. **用户查询**: 用户输入查询后,使用QueryParser创建查询对象,如`Query query = new QueryParser(Version.LUCENE_30, "content", analyzer).Parse(queryString)`。 6. **执行搜索**: 使用`IndexSearcher.Search...
- 使用`QueryParser`解析查询字符串,`Query query = new QueryParser(Version.LUCENE_21, "content", analyzer).parse(queryString);` - 初始化`IndexSearcher`,执行查询,`TopDocs topDocs = searcher.search...
这只是Lucene功能的冰山一角,更高级的应用包括多字段索引、模糊查询、排序、高亮显示、分页检索等。在实际项目中,你可能需要结合实际需求,选择合适的存储方式(如磁盘目录或文件系统),以及优化分析器以适应特定...
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35, analyzer); iwc.setOpenMode(OpenMode.CREATE); IndexWriter writer = new IndexWriter(dir, iwc); // 索引文件的具体实现 // ... ...
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 是一个开源全文搜索引擎库,由 Apache 软件基金会开发。它提供了一个可扩展的、高性能的搜索框架,使得开发者能够在他们的应用程序中轻松地实现全文检索功能。本例子将介绍如何使用 ...