lucene - query - Actualizar el campo específico en el índice SOLR
solr vs elasticsearch (4)
Quiero usar solr para buscar artículos
Tengo 3 mesas:
- Grupo (id, nombre del grupo)
- ArticleBase (id, groupId, algún otro campo)
- Artículo (id, articleBaseId, título, fecha, ...)
en el archivo solr schema.xml solo defino todo el campo de artículo que se mezcló con la tabla ArticleBase (para usar un índice en solr) como este: (id, articleBaseId, groupId, ...)
problema : el administrador desea cambiar el grupo (ArticleBase), por lo tanto, debo actualizar (o reemplazar) todos los artículos indexados en solr. derecho ?
¿Puedo actualizar GroupID solo en el índice de Solr?
tener alguna solución?
Nota : La tabla de artículos contiene más de 200 millones de artículos, y yo usando solr solo para índice (no almacena ningún dato de campo excepto la identificación del artículo)
Consulte este documento sobre la función "Actualización de documentos parciales" en Solr 4.0
Solr 4.0 ahora es final y está listo para producción.
Esta característica permite actualizar campos e incluso agregar valores a campos con múltiples valores.
Mauricio tenía razón con su respuesta en 2010, pero así son las cosas hoy.
Solr no admite la actualización de campos individuales todavía, pero existe un problema de JIRA al respecto (casi 3 años de antigüedad).
Hasta que esto se implemente, debe actualizar todo el documento.
ACTUALIZACIÓN : a partir de Solr 4+ esto se implementa, aquí está la documentación .
SolrPHP no proporciona ningún método para actualizar un campo específico en Solr.
Sin embargo, puede hacer una llamada Curl en PHP para actualizar un campo específico:
<?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));
}
Utilizo este código para actualizar en JSON, también puede proporcionar datos en XML.
Mi solución fue algo como a continuación:
$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();
}