【问题标题】:Apache Solr - Which is the best way to handle commitsApache Solr - 这是处理提交的最佳方式
【发布时间】:2013-07-26 13:24:30
【问题描述】:

我有以下情况。一个批处理过程,它从 SQL 数据库中读取“x”条记录(其中 X 大约是数千条记录的 10 条记录),将它们转换为 SOLR 文档,索引并提交给 SOLR。所以...

1) 从数据库中读取
2) 变换
3) 提交

此过程每天运行。几天后,SOLR 进程总是达到可能的最大线程数 (1024)。我对 SOLR 不是很有经验,但我觉得问题在于提交太多。

我正在考虑在“Y”转换之后提交(其中“Y”不够大而不会导致内存问题)。这是最好的方法吗?有人遇到过这个问题吗?

PS:我使用 SOLR 4。我使用 Java 作为客户端。

谢谢

【问题讨论】:

    标签: java apache solr nosql


    【解决方案1】:

    您需要在部署中更改 solrconfig.xml:

      <updateHandler class="solr.DirectUpdateHandler2">
       ...
        <!-- Perform a <commit/> automatically under certain conditions:
             maxDocs - number of updates since last commit is greater than this
             maxTime - oldest uncommited update (in ms) is this long ago
        <autoCommit> 
          <maxDocs>10000</maxDocs>
          <maxTime>1000</maxTime> 
        </autoCommit>
        -->
       ...
       ...
      </updateHandler>
    

    &lt;autoCommit&gt; 元素被注释掉。取消注释并为 maxDocs 和 maxTime 设置适当的值。 基本上它说:

    提交命令将在设定的时间或文档数量后自动发出。

    您只能指定 2 个条件中的一个:

    <autoCommit>
        <maxTime>60000</maxTime>
    </autoCommit>
    

    如果您希望在提交后重新打开搜索,那么您可能还希望这样:

    <autoCommit>
        <maxTime>60000</maxTime>
        <openSearcher>true</openSearcher>
    </autoCommit>
    

    【讨论】:

    • 谢谢马达夫。这是否意味着我必须从我的代码中删除所有显式提交?
    • 是的,如果您只想依赖 'maxTime' 和/或 'maxDoc' 的配置,可以删除显式提交。您还可以在应用程序代码中保留显式提交。让我们假设有一个管理 GUI 应用程序,其中一些管理员/业务用户可能想要手动添加一些“记录”,并希望在按下按钮时看到这些记录出现在搜索结果中。在这种情况下,需要从 GUI 中的“添加记录”按钮触发手动提交。
    • 自动提交工作正常。我将它设置为 1 分钟,这通常足以让 SOlR 索引我扔给它的所有“记录”。因此,我已经从 12,000 次提交减少到 1 次提交。
    • 1 周后,通常的问题并没有表现出来。我可以肯定地说它已关闭。谢谢马达夫。
    猜你喜欢
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2010-11-28
    • 2021-03-01
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多