2017-07-26 22 views
0

私はインデックス付きの文書にID(ユニークキー)とURLフィールドを持っています。彼らは同じ値を持っています。 そして、私は次のよう(DNS変更)URLフィールドを更新することができる午前:SOLR 6.5.1の部分的な文書更新

{ "ID ":" ABC.com/content/dam/images/infographics/Infographic_Final.pdf"、」 URL ":{" 設定 ":" XYZ.com/content/dam/images/infographics/Infographic_Final.pdf "}}

私が達成しようとしているものを私はフィールドIDを持つ1000件の文書を持っていますABC.comで始まる。 URLフィールドをXYZ.comと更新し、残りのURLパスは同じにする必要があります。私はこれを達成することができますか?私は1000回繰り返しURLを更新したくありません。

ありがとうございます。

答えて

1

Solrでは不可能なSQLの 'UPDATE table WHERE ...'のような '一括更新'を求めている場合は、あなたは各文書を提出しなければなりません(1回の要求で多数の文書を提出できますが、すべての文書の情報がそこになければなりません)。

0

Javaプログラムを使用してこれを実現できました。私はすべてIDで始まり、ABC.comで始まるSolr-queryを使用しました。私はURLに対応しています。IDは、ABC.comをXYZ.comに置き換え、残りのパスを同じにしました。 setコマンドを使用し、whileループを使用してのURLをすべて個の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(); 
関連する問題