tutorial query features examples lucene solr rdbms

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:

  1. Grupo (id, nombre del grupo)
  2. ArticleBase (id, groupId, algún otro campo)
  3. 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.



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(); }