我们在Solr中有一个多值字段,我们希望减少它的长度。 样本结果响应如下:
response": {
"numFound": 1,
"start": 0,
"docs": [
{
"created_date": "2016-11-23T13:47:46.55Z",
"solr_index_date": "2016-12-01T08:21:59.78Z",
"modified_date": "2016-12-13T08:45:44.507Z",
"id": "FEAE38C2-ABFF-4F0C-8AFD-9B8F51036D8A",
"Field1": [
"false",
"true",
"true",
..... <= 1200 items
]
}
]
}
我们有大数据,几个TB,我们正在寻找一种优化的方法来改变Solr中的所有文档,并修改Field1只包含前100个项目。
这样的事情可以在不需要编写脚本来手动获取文档,进行调整并将其推回到solr的情况下完成吗?有没有人有类似的经历?感谢
答案 0 :(得分:1)
我们遇到了这个问题。但我们使用两个集合来解决这个问题。使用 SoleEntityProcessor 将文档从一个集合移动到另一个集合。
[SolrEntityProcessor]
<dataConfig>
<document>
<entity name="sep" processor="SolrEntityProcessor" url="http://localhost:8983/solr/db" query="*:*"/>
</document>
</dataConfig>
通过 updateRequestProcessorChain 移动该文档时,我们可以编写 StatelessScriptUpdateProcessorFactory 来编辑我们的文档或截断多值字段。
在StatelessScriptUpdateProcessorFactory中,您可以获取该字段并应用您的操作,然后重置该字段。
[StatelessScriptUpdateProcessorFactory]
function processAdd(cmd) {
doc = cmd.solrDoc;
multiDate = doc.getFieldValue("multiValueField");
//Apply your operation to above field
//doc.setField("multiValueField",value);
}
function processDelete(cmd) {
// no-op
}
function processMergeIndexes(cmd) {
// no-op
}
function processCommit(cmd) {
// no-op
}
function processRollback(cmd) {
// no-op
}
function finish() {
// no-op
}
有关StatelessScriptUpdateProcessorFactory的更多信息,您可以参考此问题 On solr how can i copy selected values only from multi valued field to another multi valued field? 他们使用脚本编辑多值字段。