SolrJ deleteById 不会删除 Solr 中的数据

问题描述 投票:0回答:1

我有一个 Solr 集合,有 6 个基于年份的分片 - 2019 到 2024。我使用此方法删除该集合中的一些文档:

invoke(() -> solrClient().deleteById(collectionName, ids ));

但是,即使等待了一天,这实际上并没有删除相应 Id 的文档。然而,下面的方法可以立即删除文档。

invoke(() -> solrClient().deleteById(collectionName, ids, 1000 ));
         try {
             solrClient().commit(collectionName);
         } catch (SolrServerException e) {
             throw new RuntimeException(e);
         } catch (IOException e) {
             throw new RuntimeException(e);
         }

有人可以解释一下这里发生了什么以及我在这里使用的 commitWithinMs 值有什么意义吗 1000。我不确定是否应该将该值保留为 1000ms 还是增加它。

我正在使用 Solr 8.9 版本

我尝试在deleteById方法中将commitWithinMs参数值传递为1000,并同时进行提交,它起作用了,但我认为Solr会自动提交,并且我可以看到SolrConfig.xml中传递的自动提交时间

   <autoCommit>
            <!-- in ms, our setting is 10 min -->
            <maxTime>600000</maxTime>
            <maxDocs>100000</maxDocs>
            <openSearcher>false</openSearcher>
        </autoCommit>

仅传递 commitWithinMs 是不够的,我必须在调用 deleteByID 方法后显式进行提交

java spring solr solrj solrcloud
1个回答
0
投票

在 Apache Solr 中,添加、更新或删除文档的过程涉及两个主要步骤:将更改发送到 Solr,然后通过提交使这些更改可见。提交操作实际上是将更改保存到磁盘并使其可搜索。然而,就 I/O 而言,提交是一项昂贵的操作,而且过于频繁地执行会对 Solr 的性能产生负面影响。这就是

commitWithinMs
和自动提交的概念发挥作用的地方,理解它们可以帮助您管理数据可见性和系统性能之间的平衡。

了解
commitWithinMs

commitWithinMs
参数指定应在给定的毫秒数内将更改(在您的情况下为删除)提交到索引。当您调用
deleteById(collectionName, ids, 1000)
时,您实际上是在请求 Solr 在收到这些删除后的 1000 毫秒(1 秒)内提交这些删除。这是向 Solr 建议它应该尝试使更改尽快可见的一种方式,但不强制立即提交。

但是,需要注意的是,

commitWithinMs
是对Solr的建议,而不是严格的保证。实际提交可能会稍晚于指定时间,具体取决于服务器的负载和
solrconfig.xml
中的设置。

自动提交功能

Solr 的自动提交功能旨在在满足某些条件后自动提交更改,例如指定的时间间隔 (

maxTime
) 或一定数量的更改 (
maxDocs
)。在您的
solrconfig.xml
中,自动提交设置为每 10 分钟(
600000
毫秒)或在更改 100,000 个文档后触发。此功能可确保更改及时可见,无需手动提交,这可以通过将多个更改批处理为单个提交操作来提高性能。

为什么仍然需要显式提交

即使配置了

commitWithinMs
和自动提交,在某些情况下您可能希望显式提交更改。例如,如果您需要立即搜索某些更改,则等待下一个自动提交周期可能是不可接受的。这可能就是为什么只有在将
commit
deleteById
一起使用后显式调用
commitWithinMs
时,删除才有效。

删除后显式提交可确保更改立即可见,但应谨慎使用以避免性能问题。

推荐

  1. 明智地使用

    commitWithinMs
    :虽然指定
    commitWithinMs
    值可以帮助确保及时提交删除,但仅依赖于此而不了解对性能的影响可能会出现问题。对于操作来说,这是一个有用的参数,您可以灵活地确定更改何时可见,但想要建议一个时间范围。

  2. 了解您的应用程序的要求:如果更改的即时可见性对于您的应用程序至关重要,那么有必要通过显式提交来跟踪删除,正如您发现的那样。但是,如果您的应用程序可以容忍轻微的延迟,则依靠自动提交可以提高整体性能。

  3. 调整自动提交设置:考虑应用程序的特定需求并相应地调整

    solrconfig.xml
    中的自动提交设置。如果您的更新量很大且更新频繁,您可能需要调整
    maxTime
    maxDocs
    设置以确保更改可见性和性能之间的良好平衡。

  4. 监控性能:注意这些设置如何影响 Solr 集群的性能。调整这些设置可能需要一些尝试和错误才能找到适合您的特定用例的最佳平衡。

总之,

commitWithinMs
和显式提交的使用应根据应用程序的需求进行定制,同时牢记即时数据可见性和频繁提交的性能影响之间的权衡。

© www.soinside.com 2019 - 2024. All rights reserved.