Обновить специальное поле в индексе SOLR
Я хочу использовать solr для поиска по статьям
У меня есть 3 таблицы:
- Группа (id, название группы)
- ArticleBase (id, groupId, другое поле)
- Статья (id, articleBaseId, название, дата,...)
в файле solr schema.xml. Я просто определяю все поле статьи, которое смешивается с таблицей ArticleBase (для использования одного индекса для solr) следующим образом: (id, articleBaseId, groupId,...)
проблема: администратор хочет изменить группу (ArticleBase), поэтому я должен обновить (или заменить) всю проиндексированную статью в solr. правильно?
Могу ли я обновить groupId только в индексе solr?
имеет какое-либо решение?
Примечание: таблица Article содержит более 200 миллионов статей, и я использую solr только для индекса (не хранить никаких данных поля, кроме идентификатора статьи)
Ответы
Ответ 1
Solr не поддерживает обновление отдельных полей, но есть JIRA об этом (почти 3 года на момент написания этой статьи).
Пока это не будет реализовано, вам необходимо обновить весь документ.
UPDATE: с Solr 4+ это реализовано, здесь документация.
Ответ 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();