2010-11-03 10 views
2

Tout le monde me guidera pour mettre en évidence les résultats de recherche Solr. J'utilise DomDocument pour analyser les résultats XML.Comment mettre en évidence les résultats de recherche avec Apache SOLR avec le code PHP

Ici, j'ai l'exemple de document ci-dessous.

<add><doc> 
<field name="id">1</field><field name="title">Leason1</field> 
<field name="description">XYZ</field> 
</doc></add> 

Je reçois les résultats de recherche en utilisant la fonction ci-dessous,

function solrQuery($q){ 

$query = "?q=".trim(urlencode($q)). 
"&version=2.2&start=0&rows=10&indent=on&hl=true&hl.fl=title"; 

if($q != '') 
    return $results = request("", "select".$query); 
    return 0; 
} 

....

Dans ma page de résultat je ve afficher les données comme ci-dessous,

$results = solrQuery($query); 
if($results != ''){ 
$results = explode('<?xml version="1.0" encoding="UTF-8"?>', $results); 
$results = $results[1]; 
$dom = new DomDocument; 
$dom->loadXML($results); 
$docs = $dom->getElementsByTagName('doc'); 
foreach ($docs as $doc) { 
$strings = $doc->getElementsByTagName('str'); 
foreach($strings as $str){ 
    $attr = $str->getAttribute('name'); 
    $data = $str->textContent; 
    switch($attr){ 
    case 'id': 
    $id = $data; 
    break; 
    case 'title': 
    $title = $data; 
    break; 
    case 'description': 
    $description = $data; 
    break; 
    } 
} 

Voici le code que j'obtiens confusion comment surligner les résultats de recherche. Pouvez-vous m'aider pour ça?

Répondre

3

Vous n'avez pas besoin de surligner manuellement vos documents de Solr en PHP. Solr already provides highlighting functionality.

exécution d'une requête Solr comme http://path/to/solr:8983/?q=keyword&hl=true&hl.fl=title,text retournera quelque chose comme:

<result name="response" numFound="1" start="0"> 
    <doc> 
     <str name="id">myDocumentId</str> 
     <str name="title">The title contains keyword</str> 
     <str name="description">Keywords, keyword is highlighted.</str> 
    </doc> 
</result> 
<lst name="highlighting"> 
    <lst name="myDocumentId"> 
     <str name="title">The title contains <em>keyword</em></str> 
     <str name="description"><em>Keyword</em>s, <em>keyword</em> is highlighted.</str> 
    </lst> 
</lst> 

Maintenant, tout ce que vous devez à est de faire correspondre le document id en result à celui lst name="highlighting" (en utilisant XPath est probablement le moyen le plus facile) :

//lst[@name='highlighting']/lst[@name='myDocumentId']/* 

Le problème avec DOM est que les bandes balises HTML/XML lors de la demande $node->nodeValue, vous êtes mettant en lumière les balises (<em>) sera dépouillé. Vous devez utiliser une fonction récursive pour l'extraire avec toutes les balises, ou une solution plus simple est d'utiliser SimpleXML avec sa méthode asXML:

$sxml = new SimpleXMLElement(file_get_contents('doc.xml')); 
$nodes = $sxml->xpath("//lst[@name='highlighting']/lst[@name='myDocumentId']/*"); 

foreach ($nodes as $node) { 
    $field = $node->attributes()->name; 
    $tag = $node->getName(); 
    $value = $node->asXML(); 
    $value = preg_replace("/(<$tag name=\"$field\">|<\/$tag>)/", '', $value); 
} 
+0

J'ai utilisé la fonctionnalité de mise en surbrillance dans ma fonction SolrQuery(). Voir $ query = "? Q =". Trim (urlencode ($ q)). "& version = 2.2 & start = 0 & lignes = 10 & indent = sur & hl = true & hl.fl = titre"; La question est comment implémenter dans mon code php? – prabu

+0

Il y a un exemple qui utilise SimpleXML au bas de ma réponse. – netcoder