Solr es un servidor de búsquedas basado en Lucene que nos puede venir muy bien cuando nuestro proyecto web necesite un motor de búsqueda en condiciones, siendo una alternativa a Sphinx. Aunque está basado en Java, existe una librería que permite trabajar con ella, otra posibilidad sería utilizar Zend Search, ya que usa el formato de Lucene, aunque en una versión anterior a la que utiliza Solr, por lo que nos encontramos con incompatibilidades.
El uso de la librería es bastante sencillo:
require_once( 'Apache/Solr/Service.php' );
//
//
// Try to connect to the named server, port, and url
//
$solr = new Apache_Solr_Service( 'localhost', '8983', '/solr' );
if ( ! $solr->ping() ) {
echo 'Solr service not responding.';
exit;
}
//
//
// Create two documents to represent two auto parts.
// In practice, documents would likely be assembled from a
// database query.
//
$parts = array(
'spark_plug' => array(
'partno' => 1,
'name' => 'Spark plug',
'model' => array( 'Boxster', '924' ),
'year' => array( 1999, 2000 ),
'price' => 25.00,
'inStock' => true,
),
'windshield' => array(
'partno' => 2,
'name' => 'Windshield',
'model' => '911',
'year' => array( 1999, 2000 ),
'price' => 15.00,
'inStock' => false,
)
);
$documents = array();
foreach ( $parts as $item => $fields ) {
$part = new Apache_Solr_Document();
foreach ( $fields as $key => $value ) {
if ( is_array( $value ) ) {
foreach ( $value as $datum ) {
$part->setMultiValue( $key, $datum );
}
}
else {
$part->$key = $value;
}
}
$documents[] = $part;
}
//
//
// Load the documents into the index
//
try {
$solr->addDocuments( $documents );
$solr->commit();
$solr->optimize();
}
catch ( Exception $e ) {
echo $e->getMessage();
}
//
//
// Run some queries. Provide the raw path, a starting offset
// for result documents, and the maximum number of result
// documents to return. You can also use a fourth parameter
// to control how results are sorted and highlighted,
// among other options.
//
$offset = 0;
$limit = 10;
$queries = array(
'partno: 1 OR partno: 2',
'model: Boxster',
'name: plug'
);
foreach ( $queries as $query ) {
$response = $solr->search( $query, $offset, $limit );
if ( $response->getHttpStatus() == 200 ) {
// print_r( $response->getRawResponse() );
if ( $response->response->numFound > 0 ) {
echo "$query
";
foreach ( $response->response->docs as $doc ) {
echo "$doc->partno $doc->name
";
}
echo '
';
}
}
else {
echo $response->getHttpStatusMessage();
}
}
También recomiendo que en el esquema de Solr añadamos el filtro de caracteres mapping-ISOLatin1Accent.txt, para que no tengamos problemas a la hora de buscar palabras acentuadas sin usar los acentos (cancion => canción).
Solr PHP Client
Todo bien, pero el navegador que utilizas no tiene pestañas..??
Me gusta la idea 😉
Pero le harÃa un cambio para hacer el snippet más “WordPress compliant” 🙂
Puedes sustituir todas las condiciones del primer if por esta más sencilla:
$current_screen->id = 'post'
Upss! me deje un =, serÃa:
$current_screen->id == ‘post’
Para que no salgan los nuevos enlaces en el listado de posts, sólo en la de edición del post.
Gracias Samuel, pero el script solo sale en la edición de posts, ya que evalua esta condición:
$_GET[‘action’] == ‘edit’
Eso sÃ, seguro que al script le faltan muchas cosas 🙂
Gracias
Gracias a ti por la idea 😉
SÃ, si el script sólo sale en la edición de posts… tanto el original como con la modificación que te propongo.
Únicamente que en el primer comentario puse sólo un
=
y asà sà que darÃa el problema de salir también los listados, de ahà mi segundo comentario, poniendo==
sale sólo en la ventana de edición. Y no es necesario hacer se pedazo de if que haces 😉Yo es que soy muy fanático de usar siempre los métodos que proporciona WordPress en lugar de hacerlo con php “estándar”. Porque asà siempre tienes más opciones de compatibilidad futura e incluso de mejor rendimiento.
Pero vamos, que sÃ, que el script funciona igual en su formato original 😀