我想将标签添加到现有文档。该tags
字段已存储但未编入索引,但我希望在没有(软)提交开销的情况下查看最新值。tags
例如q=christmas&fl=text,tags
将在提交之前返回最新的标签。
我知道 Solr 4.0 有部分文档更新,但它仍然需要重新索引文档才能看到该更改。
有没有办法在不进行昂贵的重新索引的情况下获得最新价值?比如NRT?
我更喜欢旧查询处理程序附带的结果。
在 NRT 的情况下,我不介意延迟几秒钟。
我想将标签添加到现有文档。该tags
字段已存储但未编入索引,但我希望在没有(软)提交开销的情况下查看最新值。tags
例如q=christmas&fl=text,tags
将在提交之前返回最新的标签。
我知道 Solr 4.0 有部分文档更新,但它仍然需要重新索引文档才能看到该更改。
有没有办法在不进行昂贵的重新索引的情况下获得最新价值?比如NRT?
我更喜欢旧查询处理程序附带的结果。
在 NRT 的情况下,我不介意延迟几秒钟。
您可以考虑在 Solr 中使用ExternalFileField 。这可能是获取未直接存储在索引中的值的唯一方法。但是,每次更新文件时都必须重新加载,因此这可能是一个潜在的性能问题 - 请参阅Solr 邮件列表中的 ExternalFileField 最佳实践。
此外,如果您决定这样做,这里是如何在 Solr 中使用 ExternalFileField 的一个很好的演练。
更新:
我建议使用Solr 4.0 附带的RealTime Get via 。/get
这提供了您正在寻找的确切功能。然后,您可以将其与文档更新结合起来,无需每次都更新整个文档。
更新 2:RealTimeGetComponent
所以我查看了处理程序源代码,并且有一个RealTimeGetComponent。我在默认处理程序上启用了它,/select
如下所示。主要项目是设置&get=true
参数并使其成为最后一个组件。
<!-- RealTimeGet Component-->
<searchComponent name="realtimeGet" class="solr.RealTimeGetComponent"/>
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">text</str>
<bool name="get">true</bool>
</lst>
<arr name="last-components">
<str>realtimeGet</str>
</arr>
</requestHandler>
查询 -/select?q=id%3Amydoc2&wt=xml&id=mydoc2
将产生以下输出:
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">2</int>
<lst name="params">
<str name="id">mydoc2</str>
<str name="wt">xml</str>
<str name="q">id:mydoc2</str>
</lst>
</lst>
<result name="response" numFound="1" start="0">
<doc>
<str name="id">mydoc2</str>
<arr name="title">
<str>realtime-get updated3</str>
</arr>
<long name="_version_">1419891443321798656</long>
</doc>
</result>
<doc name="doc">
<str name="id">mydoc2</str>
<arr name="title">
<str>realtime-get updated - new</str>
</arr>
<long name="_version_">1419892263820984320</long>
</doc>
</response>
所以在这个例子中,它查询项目,id=mydoc2
然后获取项目的最新版本,并显示和值id=mydoc2
的差异。_version_
title
但是,为了获得此信息,您需要传递文档的 id 或 id 以获取更新版本。该组件似乎没有被编码为能够为正在使用它的 requestHandler 中执行的查询提取更新的文档。这将是一个很好的未来功能。