2013-11-27 22 views
7

Jak zaktualizować wiele dokumentów w Solr 4.5.1 przy pomocy JSON? Próbowałem tego, ale to nie działa:Jak zaktualizować wiele dokumentów w Solr za pomocą 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." 
     } 
    ] 
    } 
} 

Odpowiedz

4

Solr spodziewa jeden „add” -klawisz w strukturze JSON dla każdego dokumentu (co może wydawać się dziwne, jeśli myślisz o oryginale znaczenie klucza w obiekcie), ponieważ mapuje on bezpośrednio do formatu XML podczas indeksowania - i w ten sposób możesz mieć metadane dla każdego dokumentu samodzielnie.

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

.. działa. Myślę, że zezwolenie na tablicę jako element, do którego odnosi się "dodaj", miałoby więcej sensu, ale nie zagłębiłem się w źródło ani nie znam uzasadnienia tego.

+0

Dzięki. To jest nieprawidłowy format JSON, prawda? Nie ma szansy na wyprodukowanie tego wyjścia, ale robi to ręcznie. – burnersk

+0

Przekazuje niektóre walidatory online, ale http://www.freeformatter.com/json-validator.html wyjaśnia, że ​​"Dane wejściowe JSON są NIEAKTYWNE zgodnie z RFC 4627 (specyfikacja JSON) Nieoczekiwany duplikat klucza: dodaj na pozycji 136. " – CoDEmanX

5

Rozumiem, że (przynajmniej) z wersji 4.0 i starszych z solr, zostało to naprawione. Spójrz na http://wiki.apache.org/solr/UpdateJSON.

W ./exampledocs/books.json znajduje się przykład pliku json z wieloma dokumentami.

[ 
{ 
"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 
}, 
... 
] 

Podczas @fiskfisk odpowiedź jest nadal ważny JSON, nie jest łatwo być serializable ze struktury danych. Ten jest.

1

elachell jest poprawny, że format tablicy będzie działał, jeśli właśnie dodajesz dokumenty z ustawieniami domyślnymi. Niestety, to nie zadziała, jeśli na przykład musisz dodać niestandardowe zwiększenie do niektórych dokumentów lub zmienić ustawienie nadpisywania. Następnie musisz użyć pełnej struktury obiektu z kluczem "dodaj" dla każdego z nich, co, jak zaznaczyli, czyni to denerwująco denerwującym, aby spróbować serializować z większości języków, które nie pozwalają na ten sam klucz więcej niż raz w obiekt:

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

}

0

Inną opcją jeśli jesteś na Solr 4.10 lub nowszy jest użycie niestandardowej struktury JSON i powiedzieć Solr jak indeks go (nie wiem jak dodać zwiększa tą metodą albo, ale jest to dobra opcja, jeśli już masz strukturę danych w JSON i nie chcesz jej konwertować do formatu Solr). Oto dokumentacja Solr na temat tej opcji:

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