2012-08-03 18 views
10

c'è la possibilità di aggiornare un nuovo campo in un documento esistente? Ad esempio: C'è un documento con diversi campi, ad es.Aggiornare un nuovo campo nel documento esistente

ID=99999 
Field1:text 
Field2:text 

Questo documento è già nell'indice, ora voglio inserire un nuovo campo a questo documento senza i vecchi dati:

ID=99999 
Field3:text 

Per il momento, il vecchio documento verrà eliminato e un nuovo verrà creato un documento con l'ID. Quindi, se ora cerco il ID 99999 il risultato sarà:

ID=99999 
Field3:text 

ho letto questo al Solr Wiki

Come posso aggiornare un campo specifico di un documento esistente?

Desidero aggiornare un campo specifico in un documento, è possibile? Ho solo bisogno di indicizzare un campo per> un documento specifico. Devo indicizzare tutto il documento per questo?

No, solo l'unico documento. Supponiamo di avere un CMS e di modificare un documento. È necessario reindicizzare questo documento solo utilizzando l'istruzione add solr per l'intero documento (non solo un campo).

In Lucene per aggiornare un documento l'operazione è in realtà un'eliminazione seguita da un add. Avrai bisogno di aggiungere il documento completo in quanto non esiste una semantica del tipo "aggiorna solo un campo" in Lucene.

Quindi c'è qualche soluzione per questo? Questa funzione sarà implementata in un'ulteriore versione (attualmente utilizzo 3.6.0). Come soluzione, ho pensato di scrivere uno script o un'applicazione, che raccoglierà i campi esistenti, aggiungere il nuovo campo e aggiornare l'intero documento. Ma penso che questo risentirà delle prestazioni. Hai qualche altra idea?

migliori saluti

risposta

10

che ho per te 2 risposte (sia più o meno male):

  1. Per aggiornare presentata entro documento Solr è necessario reindicizzare intero documento (per aggiornare Field3 all'interno ID del documento : 99999 devi reindicizzare quel documento con i valori per tutti i campi)
  2. In Solr 4 hanno implementato una funzione del genere, ma hanno una condizione: tutti i campi devono essere memorizzati, non solo indicizzati. Quello che sta accadendo è che stanno usando i valori memorizzati e il documento di reindicizzazione in background. Se sei interessato, c'è un bell'articolo a riguardo: http://solr.pl/en/2012/07/09/solr-4-0-partial-documents-update/ Questa soluzione ha evidenti difetti e dimensioni dell'indice quando stai memorizzando tutti i campi.

Spero che questo ti aiuti con il tuo problema. Se avete altre domande, per favore chiedete al

+0

Grazie mille! La tua prima risposta è proprio quello a cui ho pensato. Pensi che questo sarà molto penalizzato dalle prestazioni? Per la risposta 2: puoi darmi un link ufficiale con questo log delle modifiche? Non ero in grado di trovare questa funzione. Nice link :-) –

+0

Dipende dalla frequenza con cui si apportano modifiche, quanto è grande l'indice, quanto sono grandi i documenti, quale hardware si sta utilizzando. Come ogni cambiamento costa IO, CPU ecc., Dovresti sperimentare quanto nel tuo caso. Per la seconda parte non riesco a trovarlo nel registro: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?view=markup tuttavia Yonik Seeley sta confermando che in http: // grokbase.com/t/lucene/solr-user/127bc3svh7/updating-documents – Fuxi

+0

Il mio indice contiene circa 1,8 milioni di documenti, ogni documento ha circa 10-30 campi multivalore. Il problema è che lo sviluppo dell'applicazione avrà un costo eccessivo, se non posso usarlo a causa di una perdita di prestazioni elevata. Si consiglia di cambiare la versione alla versione alpha 4.0? Hai qualche esperienza? Grazie mille :-) –

6

E 'possibile farlo in Solr 4. E.g.Si consideri il seguente documento

{ 
"id": "book123", 
"name" : "Solr Rocks" 
} 

Per aggiungere un campo autore al documento il valore del campo sarebbe un oggetto JSON con "set" di attributo e il valore del campo

$ curl http://localhost:8983/solr/update -H 'Content-type:application/json' -d ' 
[ 
{"id"  : "book123", 
    "author" : {"set":"The Community"} 
} 
]' 

tuo nuovo documento

$ curl http://localhost:8983/solr/get?id=book123 

sarà

{ 
"doc" : { 
    "id" : "book123", 
    "name" : "Solr Rocks" 
    "author": "The Community" 
} 
} 

Set aggiungerà o sostituirà il campo autore. Insieme al set hai anche la possibilità di incrementare (inc) e aggiungere (aggiungere)

+0

Voglio aggiornare il documento sul campo autore non usando il campo ID. Come lo posso fare? – iNikkz

0

Da Solr 4 in poi puoi aggiornare un campo in solr .... non c'è bisogno di reindicizzare gli interi indici .... vari modificatori sono supportati come ....

set - impostare o sostituire un particolare valore, o rimuovere il valore se nulla è specificato come nuovo valore add - aggiunge un valore aggiunto a un elenco remove - rimuove un valore (o un elenco di valori) da un elenco removeregex: rimuove da un elenco che corrisponde all'espressione regolare Java specificata inc - incrementa un valore numerico di un importo specifico (utilizza un valore negativo per diminuire)

esempio:

documento

{ 
"id": "1", 
"name" : "Solr" 
"views" : "2" 
} 

ora aggiornare con

$ curl http://localhost:8983/solr/demo/update -d ' 
[ 
{"id"   : "1", 
    "author" : {"set":"Neal Stephenson"}, 
    "views" : {"inc":3}, 
    } 
]' 

si tradurrà in

{ 
"id": "1", 
"name" : "Solr" 
"views" : "5" 
"author" : "Neal Stephenson" 
} 
Problemi correlati