Подтвердить что ты не робот

Обновить специальное поле в индексе SOLR

Я хочу использовать solr для поиска по статьям

У меня есть 3 таблицы:

  • Группа (id, название группы)
  • ArticleBase (id, groupId, другое поле)
  • Статья (id, articleBaseId, название, дата,...)

в файле solr schema.xml. Я просто определяю все поле статьи, которое смешивается с таблицей ArticleBase (для использования одного индекса для solr) следующим образом: (id, articleBaseId, groupId,...)

проблема: администратор хочет изменить группу (ArticleBase), поэтому я должен обновить (или заменить) всю проиндексированную статью в solr. правильно?
Могу ли я обновить groupId только в индексе solr?

имеет какое-либо решение?

Примечание: таблица Article содержит более 200 миллионов статей, и я использую solr только для индекса (не хранить никаких данных поля, кроме идентификатора статьи)

4b9b3361

Ответ 2

Обратитесь к этому документу о функции "Обновление частичных документов" в Solr 4.0

Solr 4.0 теперь окончательный и готовый к производству.

Эта функция позволяет обновлять поля и даже добавлять значения к полям с несколькими значениями.

Маурисио был прав с его ответом еще в 2010 году, но сейчас так происходит.

Ответ 3

SolrPHP не предоставляет какой-либо метод для обновления определенного поля в Solr.

Однако вы можете сделать вызов Curl в PHP для обновления определенного поля:

<?php
// Update array
$update = array(
    'id' => $docId,
    $solrFieldName => array(
        'set' => $solrFieldValue
    )
);
$update = json_encode(array($update));

// Create curl resource and URL
$ch = curl_init('http://'.SOLR_HOSTNAME.':'.SOLR_PORT.'/'.SOLR_COLLECTION.'/update?commit=true');

// Set Login/Password auth (if required)
curl_setopt($ch, CURLOPT_USERPWD, SOLR_LOGIN.':'.SOLR_PASSWORD);

// Set POST fields
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $update);

// Return transfert
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Set type of data sent
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));

// Get response result
$output = json_decode(curl_exec($ch));

// Get response code
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// Close Curl resource
curl_close($ch);

if ($responseCode == 200)
{
    echo 'SOLR: Updated successfully field '.$solrFieldName.' for id:'.$docId.' (query time: '.$output->responseHeader->QTime.'ms).';
}
else
{
    echo ('SOLR: Can\'t update field '.$solrFieldName.' for id:'.$docId.', response ('.$responseCode.') is: '.print_r($output,true));
}

Я использую этот код для обновления в JSON, вы также можете предоставлять данные в XML.

Ответ 4

Мое решение было следующим:

$client = new SolrClient($options);
$query = new SolrQuery();
// Find old Document
$query->setQuery('id:5458');
$query->setStart(0);
$query->setRows(1);
$query_response = $client->query($query);
// I had to set the parsemode to PARSE_SOLR_DOC
$query_response->setParseMode(SolrQueryResponse::PARSE_SOLR_DOC);
$response = $query_response->getResponse();
$doc = new SolrInputDocument();
// used the getInputDocument() to get the old document from the query
$doc = $response->response->docs[0]->getInputDocument();
if ($response->response->numFound) {
    $second_doc = new SolrInputDocument();
    $second_doc->addField('cat', "category123");
// Notice I removed the second parameter from the merge()
    $second_doc->merge($doc);
    $updateResponse = $client->addDocument($second_doc);
    $client->commit();
}

Ответ 5

Вы можете обратиться к этой документации для частичных обновлений. Вы можете сделать обновление, либо заменив его, либо добавив больше значений в это конкретное поле, хотя (например, список) в вашем случае не требуется

Ответ 6

Solr поддерживает различные типы операций обновления.

Набор операций обновления, поддерживаемых Solr.

'add' - добавить новое значение или значения в существующее поле документа Solr, или добавить новое поле и значения.

'set' - изменить значение или значения в существующем поле документа Solr.

'remove' - удалить все вхождения значения или значений из существующего поля документа Solr.

Вот пример того, как выполнить частичное обновление с помощью клиента Solrs Java, SolrJ

// create the SolrJ client
HttpSolrClient solrClient = new HttpSolrClient("http://localhost:8983/solr");
// for clould there is CloudSolrClient api

// create the document
SolrInputDocument solrDocument = new SolrInputDocument();
solrDocument.addField("id","12345");
Map<String,Object> solrUpdates = new HashMap<>(1);
solrUpdates.put("address","Pune");
solrDocument.addField("cat", solrUpdates); 

solrClient.add( solrDocument );  
solrClient.close();