0

我的索引文档中有 ID(唯一键)和 URL 字段。它们具有相同的值。我可以更新 URL 字段(更改 DNS),如下所示:

{" id ":"ABC.com/content/dam/images/infographics/Infographic_Final.pdf"," url ":{"set":"XYZ.com/content/dam/images/infographics/Infographic_Final.pdf"} }

我想要实现的是我有 1000 个具有以ABC.com开头的字段ID的文档。它应该使用XYZ.com更新URL字段,并且 URL 路径的其余部分必须保持不变。我能做到这一点吗?我不想重复更新 URL 1000 次。

提前致谢。

4

2 回答 2

1

如果您要求像 SQL 的“UPDATE table WHERE ...”这样的“批量更新”,这在 Solr 中是不可能的。您必须提交每个文档(请注意,您可以在一个请求中提交多个文档,但所有文档的信息都必须在其中)。

于 2017-07-26T08:50:44.867 回答
1

我能够使用Java程序来实现它。我使用 Solr-query 查找所有以ABC.com开头的ID。我得到了与该ID对应的URL ,并将ABC.com 替换为 XYZ.com并保持路径的其余部分相同。使用set 命令并使用 while 循环更新所有URL(仅 URL 字段) 。

String urlString = "http://localhost:8090/solr/collectionName";
    SolrClient solrClient = new HttpSolrClient.Builder(urlString).build();
    SolrQuery query=new SolrQuery();
    query.setQuery("id:*ABC*");
    query.setRows(2147483647);
    QueryRequest req = new QueryRequest(query);
    QueryResponse response = req.process(solrClient);   
    SolrDocumentList docList=response.getResults();
    Iterator <SolrDocument> itr=docList.iterator();


    String IdValue="";
     Map<String, String> cmd1;
     Map<String, String> cmd2;
     UpdateRequest ureq=new UpdateRequest();
    while(itr.hasNext()){
        JSONObject resultItems = new JSONObject();
        SolrDocument doc= itr.next();
        IdValue=(String)doc.getFieldValue("id");

        SolrInputDocument newdoc = new SolrInputDocument();

        cmd1 = new HashMap<String, String>();
        String URL=IdValue.replace("www.ABC.com", "www.XYZ.com");
        cmd1.put("set", URL);
        newdoc.addField("id", IdValue);
        newdoc.addField("url", cmd1);
        ureq.add(newdoc);

        cmd1=null;
        cmd2=null;
        }

    NamedList res = solrClient.request(ureq);
    System.out.println(" response "+res);

    solrClient.commit();
    solrClient.close();
于 2017-07-27T09:51:42.150 回答