pysolr обновить документ с ошибкой

обновление: Pysolr версия: 3.2.0

Это кажется ошибкой в ​​Solr. когда ничего не обновляется в операции, он будет удалять этот документ.

Раньше я использовал код в использовании pysolr в атомарном обновлении, но я сделал ошибку в следующем случае.

Теперь схема документа может быть такой:

doc = {
   'id':    ...,
   'title': ...,
   'body':  ...,
}

Я проиндексировал пакет документов и теперь хочу обновить каждый документ новым полем anchor_text. Вот мой код:

solr = pysolr.Solr(url_solr)
doc_update = {
   'id': ...,
   'anchor_text': [a,b,c,...]
}
solr.add([doc_update], fieldUpdates={
    'anchor_text': 'set'
})

Но я обнаружил, что некоторые оригинальные документы были удалены только с оставленным полем id. Примерно так после обновления:

doc = {
  'id':...
}

В частности, для тех, чье поле anchor_text является пустыми списками, оригинальные документы удаляются. В то время как другие нет.(Вероятно, я думаю, потому что я вижу только несколько случаев).

Я посмотрел на исходный код, но ничего ценного не нашел. Что тут происходит?

Как правильно использовать pysolr в документе обновления?

1 ответ

Решение

Я сталкивался с той же проблемой (python-3.6, pysolr-3.6, solr 6.4.1). Поскольку я не мог найти больше информации в Интернете, я использовал обходной путь для запросов, который я оставлю здесь на случай, если он кому-нибудь пригодится.

import requests
import json

def update_single_solr_field(doc_id_field, doc_id, field_update_name, field_update_value):
    # Updates a single field in a document with id 'doc_id'.
    # Updates only the 'field_update_name' field to the 'field_update_value', leaving other fields intact

    base_url = 'http://localhost:8983/'
    solr_url = 'solr/mysolrcore/'
    update_url = 'update?commit=true'
    full_url = base_url + solr_url + update_url
    headers = {'content-type': "application/json"}

    payload = [{
        doc_id_field: doc_id,
        field_update_name: {
            'set': field_update_value
        }
    }]

    response = requests.post(full_url, data=json.dumps(payload), headers=headers)

    return response

# example
id_field_name = 'id'
doc_id_to_update = '1700370208'
field_to_update = 'weight_field'
field_to_update_value = 20000
response_update = update_single_solr_field(id_field_name, doc_id_to_update, field_to_update, field_to_update_value)

print(response_update)
Другие вопросы по тегам