2017-07-26 96 views
0

我的索引文档中有ID(唯一键)和URL字段。它们具有相同的值。 ,我能够更新URL字段(更改DNS)如下:SOLR 6.5.1中的部分文档更新

{ “ID ”:“ ABC.com/content/dam/images/infographics/Infographic_Final.pdf”,” 网址 “:{” 设置 “:” XYZ.com/content/dam/images/infographics/Infographic_Final.pdf“}}

什么,我想要实现我必须有场ID 1000个文档从ABC.com开始。它应更新URL字段与XYZ.com和URL路径的其余部分必须保持不变。我可以做到这一点吗?我不想重复更新网址1000次。

在此先感谢。

回答

1

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

0

我能够使用Java程序实现它。我用Solr查询找到所有ID开始ABC.com。我得到URL对应于ID用XYZ.com代替ABC.com并保持路径的其余部分相同。使用设置命令并更新所有使用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();