如何减少Solr中多值字段的长度

时间:2016-12-21 07:18:38

标签: java solr

我们在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的情况下完成吗?有没有人有类似的经历?感谢

1 个答案:

答案 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? 他们使用脚本编辑多值字段。