Как обновить несколько документов в Solr с помощью JSON?

Как обновить несколько документов в Solr 4.5.1 с помощью 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."
      }
    ]
  }
}

4 ответов


Solr ожидает один"добавить" -ключ в JSON-структуре для каждого документа (что может показаться странным, если вы думаете об исходном значении ключа в объекте), поскольку он напрямую сопоставляется с форматом XML при индексировании - и таким образом вы можете иметь метаданные для каждого документа самостоятельно.

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

.. завод. Я думаю, что разрешение массива в качестве элемента, на который ссылается "add", имело бы больше смысла, но я не копал дальше в источник или не знаю, почему этот.


Я понимаю, что (по крайней мере) из версий 4.0 и старше solr это было исправлено. Посмотрите наhttp://wiki.apache.org/solr/UpdateJSON.

In ./exampledocs/книги.json существует пример файла json с несколькими документами.

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

хотя ответ @fiskfisk по-прежнему является допустимым JSON, его нелегко сериализовать из структуры данных. Этот-да.


elachell правильно, что формат массива будет работать, если вы просто добавляете документы с настройками по умолчанию. К сожалению, это не сработает, если, например, вам нужно добавить пользовательский импульс к некоторым документам или изменить параметр перезаписи. Затем вам нужно использовать полную структуру объектов с ключом" добавить " для каждого из них, что, как они указали, делает это раздражающе раздражающим, чтобы попытаться сериализовать из большинства языков, которые не позволяют один и тот же ключ более одного раза в объект:

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

}


другой вариант, если вы находитесь на Solr 4.10 или более поздней версии, - использовать пользовательскую структуру JSON и рассказать Solr, как ее индексировать (не знаю, как добавить усиления с помощью этого метода, но это хороший вариант, если у вас уже есть структура данных в JSON и вы не хотите конвертировать ее в формат Solr). Вот документация Solr по этому параметру:

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