2010-10-27 20 views
5

Solr'da şemada saklanmış = "true" ile bir alanımız varsa ve bu alanla ilişkili analizörü değiştirirsek, tüm alanları yeniden taramaksızın bu alanı güncellemek mümkün müdür? Bu, orijinal veri kaynağına geri dönmeden yeni analizör ile alanın "kayıtlı" değerlerini kullanarak yapılabilir mi?Orijinal kaynağından yeniden dizine girmeden Solr'daki şemada belirtilen analizörün değiştirilmesi mümkün mü?

+0

Bu [Bu] benzer görünmektedir (http://stackoverflow.com/questions/9105542/customizing-analyzers-in-solr/9107815#comment11455477_9107815). – RoiG

cevap

0

SolrJ'yi kullanarak bir yol buldum. Biz "yeni" inputdoc (eski resultDoc bir kopyası) eklediğinizde

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

, biz dizine şemada değişti yeni analizörü kullanır. Çok zarif değil, ama işe yarıyor.

+0

Ancak bu yeniden indeksleniyor ... –

+0

Evet xD, ancak tüm belgeler. İlk tam ithalat 8 saat sürdü ve xD'yi tekrarlamak istemiyorum. – Juampa

1

Adam, ben kodunuzu optimize ettim.

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

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