2010-11-03 40 views
2

任何人都可以引导我突出显示Solr搜索结果。我正在使用DomDocument来解析XML结果。如何突出显示使用Apache SOLR和PHP代码的搜索结果

在这里,我有如下示例文档。

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

我用下面的功能,让搜索结果,

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

....

在我的结果页面IVE的显示像下面的数据,

$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; 
    } 
} 

这里是我得到混淆的代码如何突出显示搜索结果。你能帮我解决吗?

回答

3

您不必在PHP中手动突出显示Solr中的文档。 Solr already provides highlighting functionality

执行一个Solr的查询像http://path/to/solr:8983/?q=keyword&hl=true&hl.fl=title,text将返回类似:

<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> 

现在你必须要对文档idresult匹配到一个在lst name="highlighting"(使用XPath可能是最简单的方法) :

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

与DOM的问题是,它要求$node->nodeValue当除去HTML/XML标签,所以你高亮标记(<em>)将被剥夺。你必须使用一个递归函数来提取它的所有标签,或者更简单的解决方案是使用的SimpleXML其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

我在功能solrQuery使用高亮功能()。请参阅$ query =“?q =”。trim(urlencode($ q))。 “&version = 2.2&start = 0&rows = 10&indent = on&hl = true&hl.fl = title”; 问题是如何在我的php代码中实现? – prabu 2010-11-08 09:59:06

+0

在我的答案底部有一个使用SimpleXML的例子。 – netcoder 2010-11-08 13:55:10