终于ok了。。先开心一下。
我的问题和调试经历。
我使用lucene 为数据库建立索引,在初期的测试中,对数据进行增删改查我并没有使用缓存,而是直接用indexWriter进行commit。结果每一次commit后我马上进行搜索,结果就是不出来。我查看index 文件,每一次都已进行了更新。于是我确定commit后,index已经同步了。可是为什么就是搜索不到结果了?????
我每一次重新启动程序,上一次修改的结果都能被搜索得到,这就说明了搜索本身没有问题,。问题的关键就是,存在某个问题,使索引更新的效果对我不可以见,宝贵的周五就这样浪费了。由于周六周日要兼职。没空。。所以问题一直搁浅到现在。
救赎之道
我现在发现学习一样东西基础越来越重要,要不然一个小小的错误会耽误你N多的时间,并且你毫无头绪下手。于是我决定看 lucence3.0 原理分析这个神级 pdf(网络上有下)。看完关于lucene事物性的解析后,。我相信我找到了救赎之道。
原文如下:
所谓事务性,本多指数据库的属性,包括ACID四个基本要素:原子性(Atomicity)、一致性
(Consistency)、隔离性(Isolation)、持久性(Durability)。
我们这里主要讨论隔离性,Lucene的IndexReader和IndexWriter具有隔离性。
• 当IndexReader.open打开一个索引的时候,相对于给当前索引进行了一次snapshot,此后的任何修改
都不会被看到。
• 仅当IndexReader.open打开一个索引后,才有可能看到从上次打开后对索引的修改。
• 当IndexWriter没有调用Commit的时候,其修改的内容是不能够被看到的,哪怕IndexReader被重新
打开。
•
欲使最新的修改被看到,一方面IndexWriter需要commit,一方面IndexReader重新打开。
我查看我的元代码:
public static TopDocs search(String queryStr){
TopDocs docs = null;
try{
if(searcher == null) {
indexFile = new File(index_dir);
searcher = new IndexSearcher(FSDirectory.open (indexFile));
} searcher.setSimilarity(new IKSimilarity());
QueryParser parser = new QueryParser(Version.LUCENE_30,"content",new IKAnalyzer());
Query query = parser.parse(queryStr);
TopDocs topDocs = searcher.search(query, 100);
return topDocs;
}catch(Exception e){
logger.error(SearchService.class+" search "+e.getMessage());
e.printStackTrace();
return docs;
}
}
private static Searcher searcher = null;
问题就是出在这里,第一次搜索的结果总是正确的。。之后要是做了修改都搜索不到,因为全局变量维护着search,而search 只是第一次打开index时候的snapshot.
痛苦的领悟
学习东西,基础才是王道!
分享到:
相关推荐
5. **系统兼容性问题**:在不同的操作系统上,Lucene的表现可能不同。比如,在Windows XP系统中使用Lucene时,可能不会出现像Linux那样的文件系统锁定问题,但在Linux环境下却会出现这种情况。 #### 三、解决方法 ...
在使用Lucene时,可能会遇到字符编码问题,这通常是由于不同系统或程序之间处理字符集的方式不一致导致的。下面将详细探讨Lucene中的字符编码问题及其解决方案。 首先,我们要理解什么是字符编码。字符编码是将字符...
lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....
lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0
虽然 Lucene 的原始版本主要是为英文设计的,但其设计的灵活性使得通过扩展语言分析接口,可以轻松地添加对中文等其他语言的支持。这通常涉及使用词库和自动切分词算法来处理中文的分词问题。 **应用场景** 许多...
使用这些JAR包时,开发者需要根据具体需求选择合适的模块,并确保它们的版本一致,以避免潜在的兼容性问题。同时,还需要正确配置分词器,以适应所处理的文本内容。此外,对于大型应用,可能还需要结合Solr或Elastic...
**正文** Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。...合理地利用这些技术,可以有效地提升数据检索的效率和准确性。在实际应用中,还需要结合具体业务需求和数据特性进行优化。
通过深入研究《Lucene in Action》的源码,开发者不仅可以理解Lucene的基本工作原理,还能学习如何实际应用这些知识,解决具体的搜索问题。对于初学者而言,这是一个很好的起点,可以帮助他们快速上手并逐步掌握全文...
《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...
《Lucene in Action》是关于Apache Lucene的权威指南,这本书深入浅出地介绍了全文搜索引擎的构建和优化。Lucene是一个高性能、全文本搜索库,它允许开发人员在应用程序中轻松实现复杂的搜索功能。这本书主要面向...
相比之下,关系型数据库在过去的二十余年里,因其操作便捷、易于维护、便于访问和安全性强的特点,在事务处理领域占据了主导地位。它们最初是为了满足诸如库存控制、工资计算、账目处理等传统应用场景而设计的。然而...
为了保持索引的高效性和完整性,Lucene采用了段合并机制: - **合并策略**:决定了哪些段需要合并。 - **反向信息的合并**:处理词典、文档号等信息。 - **段合并的详细过程**:从缓存写入新段到最终删除旧段的过程...
6. **高可用性**:Lucene可以与其他Java项目无缝集成,支持多线程和分布式环境。 使用Lucene的基本步骤包括: 1. **创建索引**:首先,需要将要搜索的数据(如文件内容)读取并分词,然后使用Lucene API创建索引。 ...
本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...
《深入理解Lucene:搜索引擎核心技术解析》 Lucene是一个全文搜索引擎库,由Apache软件基金会开发并维护,它提供了高效的文本检索、分析和存储功能。在Java编程语言中,Lucene被广泛应用于各种需要全文搜索功能的...
《Lucene 5.x与3.6.0版本差异详解》 ...开发者在升级到新版本时,需要注意API的变更,以避免兼容性问题,并充分利用新版本带来的优势。通过理解这些变化,开发者可以更有效地利用Lucene构建高效、稳定的全文搜索系统。
此版本修复了多个已知问题,包括潜在的数据丢失风险、并发问题以及一些边缘情况下的错误,增强了系统在高负载和复杂环境下的可靠性。 4. **新特性和改进**: - **多段合并策略**:Lucene 引入了新的多段合并策略,...
3. **多字段查询**: `MultiFieldQueryParser` 类允许同时在多个字段中进行查询,提高了搜索的灵活性。 4. **更强大的分词器**: 引入了 `TokenStream` 接口,允许自定义分词规则,增强了对各种语言的处理能力。 5. ...
《全面解析Lucene jar包:从...无论是“my的jar包”还是“ik的jar包”,都是为了让Lucene更好地适应不同的应用场景,提高搜索的效率和准确性。在实际开发中,开发者应根据需求灵活选择和配置,以实现最佳的搜索体验。