2010-10-27 13 views
5

W Solr, jeśli mamy pole w schemacie z stored = "true", a zmienimy analizator powiązany z tym polem, czy możliwe jest zaktualizowanie tylko tego pola bez ponownego indeksowania wszystkich dokumentów? Czy można to zrobić za pomocą "zapisanych" wartości pola z nowym analizatorem bez powrotu do oryginalnego źródła danych?Czy można zmienić analizator określony w schemacie w Solr bez ponownego indeksowania z oryginalnego źródła?

+0

Wydaje podobny do [tego] (http://stackoverflow.com/questions/9105542/customizing-analyzers-in-solr/9107815#comment11455477_9107815). – RoiG

Odpowiedz

0

Znalazłem sposób użycia SolrJ.

 SolrQuery query = new SolrQuery(); 

     query.setQuery("whatever_by_id"); 

     QueryResponse rsp; 

     rsp = server.query(query); 

     Iterator<SolrDocument> iter = rsp.getResults().iterator(); 

     while (iter.hasNext()) { 
      SolrDocument resultDoc = iter.next(); 
      String id = (String) resultDoc.getFieldValue("oid"); //id is the uniqueKey field 

      SolrInputDocument inputdoc = new SolrInputDocument() ; 
      for(Map.Entry<String, Object> f : resultDoc.entrySet()) { 
       inputdoc.setField(f.getKey(), f.getValue()) ; 
      } 

      server.deleteById(id) ; 
      server.commit() ; 

      Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(); 
      docs.add(inputdoc) ; 
      server.add(docs) ; 

      server.commit() ; 
     } 

Gdy dodamy do tego „nowego” inputdoc (kopia starego resultDoc), używa nowego analizatora zmieniliśmy w schemacie do indeksu. To nie jest zbyt eleganckie, ale działa.

+0

Ale to jest ponowne indeksowanie ... –

+0

Tak xD, ale nie wszystkie dokumenty. Pierwszy pełny import trwał 8 godzin i nie chcę tego powtarzać xD. – Juampa

1

Facet, zoptymalizowałem twój kod.

... 
    while (iter.hasNext()) { 
     ... 
     //server.deleteById(id) ; 
     //server.commit() ; 

     Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(); 
     docs.add(inputdoc) ; 
     server.add(docs) ; 
     // server.commit() ; 
    } 
    server.commit() ; 
Powiązane problemy