2010-11-03 133 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

相關問題