Обновить определенное поле в индексе SOLR - PullRequest
18 голосов
/ 09 января 2010

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

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

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

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

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

есть какое-нибудь решение?

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

Ответы [ 5 ]

34 голосов
/ 10 января 2010

Solr пока не поддерживает обновление отдельных полей , но существует проблема JIRA по этому поводу (почти 3 года на момент написания этой статьи).

Пока это не реализовано, вы должны обновить весь документ.

ОБНОВЛЕНИЕ : в Solr 4+ это реализовано, вот документация .

15 голосов
/ 17 августа 2012

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

Solr 4.0 теперь готов и готов к производству.

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

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

4 голосов
/ 10 сентября 2014

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.

1 голос
/ 14 декабря 2015

Мое решение было примерно таким:

$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();
}
0 голосов
/ 28 февраля 2019

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

...