Частичное обновление документа в SOLR 6.5.1

У меня есть идентификатор (уникальный ключ) и поля 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. Он должен обновить поле URL с помощью XYZ.com, а остальная часть URL-пути должна остаться прежней. могу ли я достичь этого? я не хочу обновлять URL повторно 1000 раз.

Заранее спасибо.

2 ответа

Если вы запрашиваете "массовое обновление", такое как SQL-таблица "UPDATE WHERE...", это невозможно в Solr. Вы должны отправить каждый документ (имейте в виду, вы можете отправить много документов в одном запросе, но все данные документа должны быть там).

Я смог добиться этого с помощью программы Java. Я использовал Solr-запрос, чтобы найти все идентификаторы, начиная с ABC.com. Я получил URL, соответствующий этому идентификатору, и заменил ABC.com на XYZ.com, оставив остальной путь тем же. Использовал команду set и обновил все URL (только поле URL), используя цикл 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();
Другие вопросы по тегам