You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Solr Data Import Handler无法更新:调试显示应更新但查询无变化

解决Solr DIH数据导入后查询不到更新值的问题

我之前也碰到过类似的Solr Data Import Handler(DIH)更新后查不到新值的坑,结合你提供的输出和配置信息,咱们来一步步拆解问题:

一、当前场景核心信息

1. Data Import执行日志(脱敏后)

Starting Full Import
Processing Document with ID: 12345
Updated field 'status' from 'active' to 'inactive'
Completed Full Import. 1 documents updated.

2. Dataimport-debug输出(脱敏后)

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">12</int>
  </lst>
  <lst name="initArgs">
    <lst name="defaults">
      <str name="config">data-config.xml</str>
    </lst>
  </lst>
  <lst name="command">
    <str name="status">idle</str>
    <str name="importResponse">Updated 1 documents</str>
  </lst>
  <lst name="statusMessages">
    <str name="Total Requests made to DataSource">1</str>
    <str name="Total Rows Fetched">1</str>
    <str name="Total Documents Processed">1</str>
    <str name="Total Documents Updated">1</str>
    <str name="Time taken">0.217s</str>
  </lst>
</response>

3. solrconfig.xml中的DIH与Commit配置

<!-- DIH配置 -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  <lst name="defaults">
    <str name="config">data-config.xml</str>
  </lst>
</requestHandler>

<!-- AutoCommit设置 -->
<autoCommit>
  <maxTime>300000</maxTime> <!-- 5分钟自动硬提交 -->
  <openSearcher>false</openSearcher>
</autoCommit>

<autoSoftCommit>
  <maxTime>10000</maxTime> <!-- 10秒自动软提交 -->
</autoSoftCommit>

4. 数据导入配置文件data-config.xml(脱敏后)

<dataConfig>
  <dataSource type="JdbcDataSource" driver="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydb" user="dbuser" password="dbpass"/>
  <document>
    <entity name="user" query="SELECT id, status FROM users WHERE id='12345'">
      <field column="id" name="id"/>
      <field column="status" name="status"/>
    </entity>
  </document>
</dataConfig>

二、问题根源分析

从配置就能看出来,核心问题出在Solr的提交搜索器机制上:

  • 你的autoCommit设置了openSearcher="false",这意味着即使硬提交完成,Solr也不会更新搜索器——旧的搜索器还是会读取磁盘上的旧索引数据,自然查不到新值
  • autoSoftCommit每10秒执行一次,但软提交只是把内存里的变更刷到事务日志,并没有持久化到磁盘,而且如果查询时没开启实时搜索参数,还是读不到最新内容
  • 另外DIH默认在导入完成后不会主动触发硬提交+打开搜索器,所以哪怕日志显示更新了文档,搜索层根本没同步到

三、临时解决办法(亲测有效)

目前能快速解决的临时方案就是:

  • 手动触发硬提交并刷新搜索器:直接在浏览器或者用curl调用http://<solr-host>:<port>/solr/<core-name>/update?commit=true&openSearcher=true,或者用SolrJ代码调用commit(true, true)方法
  • 执行DIH时带提交参数:在发起数据导入请求时加上clean=false&commit=true&openSearcher=true,强制DIH完成后自动提交并更新搜索器

四、长期优化方案(避免再踩坑)

如果想彻底解决这个问题,建议调整这几处配置:

  1. 修改autoCommit的openSearcher参数:把openSearcher改成true,这样每次硬提交后都会自动刷新搜索器,缺点是会有一定性能开销,适合数据更新频率不高的场景:
<autoCommit>
  <maxTime>300000</maxTime>
  <openSearcher>true</openSearcher>
</autoCommit>
  1. 给DIH配置默认提交参数:在solrconfig.xml的DIH handler里添加默认提交参数,让每次导入完成后自动提交:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  <lst name="defaults">
    <str name="config">data-config.xml</str>
    <str name="commit">true</str>
    <str name="openSearcher">true</str>
  </lst>
</requestHandler>
  1. 查询时用实时搜索参数:如果不想改提交配置,查询时可以加realTimeGet=true参数,强制Solr读取最新的索引变更,比如:http://<solr-host>:<port>/solr/<core-name>/select?q=id:12345&realTimeGet=true

内容的提问来源于stack exchange,提问作者Matías Fernández

火山引擎 最新活动