SOLR 6.5.1中的部分文档更新

时间:2017-07-26 06:09:44

标签: solr nutch solr6

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

{" ID ":" ABC.com/content/dam/images/infographics/Infographic_Final.pdf",&#34 ; URL " {"设置":" XYZ.com/content/dam/images/infographics/Infographic_Final.pdf"}}

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我能够使用Java程序实现它。我使用Solr-query查找从 ABC.com 开始的所有 ID 。我得到了与 ID 相对应的网址用XYZ.com取代了ABC.com ,并保留了其余路径相同的内容。使用设置命令并使用while循环更新了所有网址(仅限网址字段)

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();