2013-11-27 14 views
7

Come aggiornare più documenti in Solr 4.5.1 con JSON? Ho provato questo ma non funziona:Come aggiornare più documenti in Solr con JSON?

POST /solr/mycore/update/json:

{ 
    "commit": {}, 
    "add": { 
    "overwrite": true, 
    "doc": [{ 
     "thumbnail": "/images/404.png", 
     "url": "/404.html?1", 
     "id": "demo:/404.html?1", 
     "channel": "demo", 
     "display_name": "One entry", 
     "description": "One entry is not enough." 
     }, { 
     "thumbnail": "/images/404.png", 
     "url": "/404.html?2", 
     "id": "demo:/404.html?2", 
     "channel": "demo", 
     "display_name": "Another entry", 
     "description": "Another entry is required." 
     } 
    ] 
    } 
} 

risposta

4

Solr si aspetta un "add" tasto nel JSON-struttura per ogni documento (che potrebbe sembrare strano, se si pensa a quello originale significato della chiave nell'oggetto), poiché si associa direttamente al formato XML quando si esegue l'indicizzazione - e in questo modo è possibile avere i metadati per ciascun documento da solo.

{ 
    "commit": {}, 
    "add": { 
     "doc": { 
      "id": "321321", 
      "name": "barfoo" 
     } 
    }, 
    "add": { 
     "doc": { 
      "id": "123123", 
      "name": "Foobar"   
     } 
    } 
} 

.. funziona. Penso che consentire un array come l'elemento a cui fa riferimento "aggiungi" avrebbe più senso, ma non ho scavato ulteriormente nella fonte o non conosco il ragionamento alla base di questo.

+0

Grazie. Questo è un formato JSON non valido, giusto? Non c'è possibilità di produrre questo output ma farlo codificare a mano. – burnersk

+0

Passa alcuni validatori online, ma http://www.freeformatter.com/json-validator.html spiega che "L'input JSON NON è valido secondo RFC 4627 (specifica JSON). Chiave duplicata inaspettata: aggiungi alla posizione 136. " – CoDEmanX

5

Comprendo che (almeno) dalle versioni 4.0 e precedenti di solr, questo problema è stato risolto. Guarda http://wiki.apache.org/solr/UpdateJSON.

In ./exampledocs/books.json è presente un esempio di file JSON con più documenti.

[ 
{ 
"id" : "978-0641723445", 
"cat" : ["book","hardcover"], 
"name" : "The Lightning Thief", 
"author" : "Rick Riordan", 
"series_t" : "Percy Jackson and the Olympians", 
"sequence_i" : 1, 
"genre_s" : "fantasy", 
"inStock" : true, 
"price" : 12.50, 
"pages_i" : 384 
} 
, 
{ 
"id" : "978-1423103349", 
"cat" : ["book","paperback"], 
"name" : "The Sea of Monsters", 
"author" : "Rick Riordan", 
"series_t" : "Percy Jackson and the Olympians", 
"sequence_i" : 2, 
"genre_s" : "fantasy", 
"inStock" : true, 
"price" : 6.49, 
"pages_i" : 304 
}, 
... 
] 

Mentre risposta @fiskfisk è ancora un JSON valida, non è facile essere serializzabile da una struttura dati. Questo è.

1

elachell è corretto che il formato dell'array funzionerà se si aggiungono solo documenti con le impostazioni predefinite. Sfortunatamente, ciò non funzionerà se, ad esempio, è necessario aggiungere un boost personalizzato ad alcuni documenti o modificare l'impostazione di sovrascrittura. Dovrai quindi utilizzare la struttura completa dell'oggetto con un tasto "aggiungi" per ognuno di essi, che, come hanno sottolineato, rende fastidiosamente frustrante provare a serializzare dalla maggior parte delle lingue che non consentono la stessa chiave più di una volta in un oggetto:

{ 
"commit": {}, 
"add": { 
    "doc": { 
     "id": "321321", 
     "name": "barfoo" 
    }, 
    "boost": 2.0 
}, 
"add": { 
    "doc": { 
     "id": "123123", 
     "name": "Foobar"   
    }, 
    "boost": 1.5, 
    "overwrite": false 
    } 

}

0

Un'altra opzione se siete su Solr 4.10 o successivo è quello di utilizzare una struttura JSON personalizzato e dire Solr come indicizzare esso (non so come aggiungere aumenta con questo metodo sia, ma è una buona opzione se hai già una struttura dati in JSON e non vuoi convertirla nel formato di Solr). Ecco la documentazione Solr su questa opzione:

https://cwiki.apache.org/confluence/display/solr/Uploading+Data+with+Index+Handlers#UploadingDatawithIndexHandlers-TransformingandIndexingCustomJSON