我想在现有文档中添加标签。 tags
字段已存储但未编入索引,但我希望在没有(软)提交开销的情况下看到tags
的最新值。例如,q=christmas&fl=text,tags
将在提交之前返回最新的标记。
我知道Solr 4.0有部分文档更新,但在更改可见之前仍需要重新索引文档。
有没有办法在不做昂贵的重新索引的情况下获得最新价值;比如用NRT?
我更喜欢旧查询处理程序的结果。
在NRT的情况下,我不介意延迟几秒钟。
答案 0 :(得分:1)
您可以考虑在Solr中使用ExternalFileField。这可能是获取未直接存储在索引中的值的存储的唯一方法。但是,每次更新文件时都必须重新加载,因此可能存在潜在的性能问题 - 请参阅ExternalFileField Best Practices from the Solr Mailing List。
此外,如果您决定使用ExternalFileField in Solr,还可以使用RealTime Get。
<强>更新强>
我建议使用Solr 4.0附带的RealTimeGetComponent via /get
。这提供了您正在寻找的确切功能。然后,您可以将其与文档更新结合使用,无需每次都更新整个文档。
Update2:RealTimeGetComponent
所以我查看了处理程序源代码,并且有一个{{3}}。我在默认的/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中执行的查询提取更新的文档。这将是一个很好的未来功能。