Solr在从旧的已删除或更新的文档进行分面时提供旧数据。
例如,我们正在对名称进行分区。我们的应用经常更改名称。当我们在更改名称后索引文档时,我们在搜索结果中获得旧名称和新名称。在深入研究之后,我知道Solr索引由段组成(一次写入),每个段包含一组文档。每当硬提交发生时,这些段将被关闭,即使文件被删除,它仍然会有那些文件(将被标记为已删除)。这些文件不会立即清除。它虽然不会显示在搜索结果中,但不知何故,faceting仍然能够访问这些数据。
优化解决了这个问题。但是,每次客户更改生产数据时,我们都无法执行此操作。我试过以下选项,这对我没用。
1)expungeDeletes。
在solrconfig.xml
中添加了以下这一行<autoCommit>
<maxTime>30000</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
<!-- softAutoCommit is like autoCommit except it causes a
'soft' commit which only ensures that changes are visible
but does not ensure that data is synced to disk. This is
faster and more near-realtime friendly than a hard commit.
-->
<autoSoftCommit>
<maxTime>10000</maxTime>
</autoSoftCommit>
<commit waitSearcher="false" expungeDeletes="true"/>
2)使用TieredMergePolicyFactory可能无法帮助我,因为阈值可能无法始终达到,用户将在此期间看到旧数据。
3)另一种方法是调用每天在solrj中暴露一次的optimize()方法。但不确定这会对性能产生什么影响。
我们为每台服务器编制索引的文档数量最多为2M-3M。
请建议是否有任何解决方案。
如果需要更多数据,请告诉我。