当前位置: 首页 > 面试题库 >

具有频繁更新索引的FieldCache

越新霁
2023-03-14
问题内容

嗨,
我的lucene索引经常用新记录更新,索引中有5,000,000条记录,并且正在使用FieldCache缓存我的一个数字字段。但是在更新索引之后,需要花费一些时间来重新加载FieldCache(由于重新加载缓存,导致文档说DocID不可靠),所以如何通过仅将新添加的DocID添加到FieldCache来最小化此开销,导致此功能成为瓶颈应用。

IndexReader reader = IndexReader.Open(diskDir);
int[] dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, "newsdate"); // This line takes 4 seconds to load the array
dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, "newsdate"); // this line takes 0 second as we expected
// HERE we add some document to index and we need to reload the index to reflect changes

reader = reader.Reopen();
dateArr = FieldCache_Fields.DEFAULT.GetInts(reader, "newsdate"); // This takes 4 second again to load the array

我想要一种通过仅将新添加的文档添加到数组中的索引来最大程度地减少这种时间的机制,其中有一种类似http://invertedindex.blogspot.com/2009/04/lucene-
dociduid-mapping-and-
payload
的技术。 html
可以提高性能,但是它仍然可以加载我们已经拥有的所有文档,而且我认为如果我们找到一种仅将新添加的文档添加到数组中的方法,则无需重新加载所有文档


问题答案:

FieldCache使用弱引用来索引阅读器,作为其缓存的键。(通过调用IndexReader.GetCacheKey已未过时。)的标准调用IndexReader.Open一个FSDirectory会用读者的一个游泳池,一个为每个段。

您应该始终将最里面的读取器传递给FieldCache。签出ReaderUtil一些帮助者的资料,以检索其中包含文档的个人阅读器。文档ID不会在段中更改,将其描述为不可预测/易变的含义是在两次索引提交之间更改。可以对删除的文档进行验证,对段进行合并以及执行此类操作。

提交需要从磁盘中删除该段(合并/优化),这意味着新的读取器将没有池化段读取器,并且在关闭所有较旧的读取器后,垃圾回收会将其删除。

永远不要打电话FieldCache.PurgeAllCaches()。它仅用于测试,而不是用于生产。

新增2011-04-03; 使用子阅读器的示例代码。

var directory = FSDirectory.Open(new DirectoryInfo("index"));
var reader = IndexReader.Open(directory, readOnly: true);
var documentId = 1337;

// Grab all subreaders.
var subReaders = new List<IndexReader>();
ReaderUtil.GatherSubReaders(subReaders, reader);

// Loop through all subreaders. While subReaderId is higher than the
// maximum document id in the subreader, go to next.
var subReaderId = documentId;
var subReader = subReaders.First(sub => {
    if (sub.MaxDoc() < subReaderId) {
        subReaderId -= sub.MaxDoc();
        return false;
    }

    return true;
});

var values = FieldCache_Fields.DEFAULT.GetInts(subReader, "newsdate");
var value = values[subReaderId];


 类似资料:
  • 我希望有Apache Ignite经验的人能够帮助指导我的团队找到关于Apache Ignite新设置的答案。 数据从许多分布式传感器中不断产生,并流进我们的数据库。每个传感器每秒可能提供许多更新,但通常每秒生成<10个更新。 null 查询相当复杂,需要在时间上进行重要的(和动态的)回溯。一个查询可能需要来自一个站点中多个传感器的数据,但所需的传感器是动态确定的。大多数连续查询只需要最近几个小时

  • 问题内容: 是否可以在经常修改的对象上使用缓存?例如,假设我们有一个BlogPost对象,并且有一个num_of_views列(以及其他)经常更改。是否可以在高速缓存和数据库中更新num_of_views字段,而无需破坏高速缓存对象并重新创建它?我可以手动完成,但是我担心同步问题。 问题答案: 是的。我不知道您的缓存状况如何,但是您可以随时替换缓存实例:

  • 这种情况下定期做索引重建,是一种很好的解决办法吗?

  • 问题内容: 我目前正在Linux系统上以python编写程序。目的是在发现特定字符串后读取日志文件并执行bash命令。日志文件正在被另一个程序不断写入。 我的问题 :如果使用该方法打开文件,我的Python文件对象将随着其他程序写入实际文件而更新,还是我必须在一定时间间隔内重新打开文件? 更新 :感谢到目前为止的答案。我也许应该提到,该文件是由Java EE应用程序写入的,所以我无法控制何时将数据

  • 我有一个用例,需要将小文档批(通常是1到10个1KB的文档)上传到CloudSearch。每2或3秒就会上传一个新批次。批量上传的CloudSearch文档说: 确保您的批次尽可能接近5 MB的限制。上载大量较小的批次会减慢上载和索引过程。 如果在文档出现在搜索结果中之前有30秒的延迟,也可以。随着我的文档数量不断增加,比如说增加到50万个文档,我的实现能否正常工作?

  • 假设我有两组对象“Questions”和“Users”,它们共享一个关系。 什么是最好的方法索引我的对象,以允许最新的变化反映在lucene IDEX? 是否应该为用户和问题提供单独的文档,并让lucene根据需要获取所需的问题/用户详细信息? 还是,走数据传输对象的方式?当发生更改时,只需删除这些文档并重新索引?