Этот вопрос похож на Solr не перезаписывает - дублируются записи uniqueKey , но я нахожусь в ситуации, когда у меня большой массив существующих документов, которые уже были добавлены в коллекцию без дочерних элементов документы, и я использую (автономный не облачный) Solr 6.4, а не 5.3.1. Недавно мы включили дочерние документы, чтобы мы могли хранить более богатые данные.
Мы используем SolrJ для загрузки данных и запроса Solr, но чтобы изолировать наблюдаемую проблему, я использовал инструмент командной строки Solr post
, чтобы загрузить следующий документ:
<add>
<doc>
<field name="id">1</field>
<field name="solr_record_type">1</field>
<field name="title">Fabulous Book</field>
<field name="author">Angelo Author</field>
</doc>
</add>
Результаты поиска были, как и ожидалось:
Используя q=id:1
и
fl=id,title,index_date,[child parentFilter="solr_record_type:1"]
"response":{"numFound":1,"start":0,"docs":[
{
"id":"1",
"title":"Fabulous Book",
"index_date":"2019-01-16T23:06:57.221Z"}]
}
Затем я обновил документ, опубликовав следующее:
<add>
<doc>
<field name="id">1</field>
<field name="solr_record_type">1</field>
<field name="title">Fabulous Book</field>
<field name="author">Angelo Author</field>
<doc>
<field name="id">1-1</field>
<field name="solr_record_type">2</field>
<field name="contributor_name">Polly Math</field>
<field name="contributor_type">3</field>
</doc>
</doc>
</add>
Затем, повторяя мой поиск, я получил следующий повторяющийся результат поиска в уникальном поле идентификатора, что нежелательно.
"response":{"numFound":2,"start":0,"docs":[
{
"id":"1",
"title":"Fabulous Book",
"index_date":"2019-01-16T23:06:57.221Z",
"_childDocuments_":[
{
"id":"1-1",
"solr_record_type":2,
"contributor_name":"Polly Math",
"contributor_type":3,
"index_date":"2019-01-16T23:09:29.142Z"}]},
{
"id":"1",
"title":"Fabulous Book",
"index_date":"2019-01-16T23:09:29.142Z",
"_childDocuments_":[
{
"id":"1-1",
"solr_record_type":2,
"contributor_name":"Polly Math",
"contributor_type":3,
"index_date":"2019-01-16T23:09:29.142Z"}]}]
}
Иначе, если я начну с документа, который был изначально загружен с дочерним документом, как показано ниже:
<add>
<doc>
<field name="id">2</field>
<field name="solr_record_type">1</field>
<field name="title">Wonderful Book</field>
<field name="author">Andy Author</field>
<doc>
<field name="id">2-1</field>
<field name="solr_record_type">2</field>
<field name="contributor_name">Polly Math</field>
<field name="contributor_type">3</field>
</doc>
</doc>
</add>
А потом я обновляю его документом без детей:
<add>
<doc>
<field name="id">2</field>
<field name="solr_record_type">1</field>
<field name="title">Wonderful Book</field>
<field name="author">Andy Author</field>
</doc>
</add>
У результата еще есть дочерний элемент:
"response":{"numFound":1,"start":0,"docs":[
{
"id":"2",
"title":"Wonderful Book",
"index_date":"2019-01-16T23:09:39.389Z",
"_childDocuments_":[
{
"id":"2-1",
"title_id":2,
"title_instance_id":2,
"solr_record_type":2,
"contributor_name":"Polly Math",
"contributor_type":3,
"index_date":"2019-01-16T23:07:04.861Z"}]}]
}
Это странно, потому что если я обновляю документ с 2 дочерними документами с заменой документа только с 1 дочерним документом, он отбрасывает один дочерний документ. Но в этом случае дочерний документ не удаляется.
Обновления документов без дочерних документов, которые не добавляют дочерние документы, и обновления документов с дочерними документами, которые не удаляют все дочерние документы, оба работают, как я ожидал.
У меня есть большое количество существующих документов, в которых нет детей, к которым я, возможно, добавляю детей, и в конечном итоге у меня может быть много документов, имеющих детей, которые могут бросить их детей. Учитывая это, каков наилучший способ обновить эти записи, не создавая дубликаты записей или не теряя обновления?