如何使用Apache SOLR和PHP代码突出显示搜索结果

如何使用Apache SOLR和PHP代码突出显示搜索结果,php,solr,Php,Solr,任何人都可以指导我如何突出显示Solr搜索结果。我正在使用DomDocument for解析xml结果 在这里,我有下面的示例文档 <add><doc> <field name="id">1</field><field name="title">Leason1</field> <field name="description">XYZ</field> </doc></add>

任何人都可以指导我如何突出显示Solr搜索结果。我正在使用DomDocument for解析xml结果

在这里,我有下面的示例文档

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

在我的结果页面中,我显示了如下数据:

$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;
    } 
 }
$results=solrQuery($query);
如果($results!=''){
$results=爆炸(“”,$results);
$results=$results[1];
$dom=新的DomDocument;
$dom->loadXML($results);
$docs=$dom->getElementsByTagName('doc');
foreach($docs作为$doc){
$strings=$doc->getElementsByTagName('str');
foreach($str形式的字符串){
$attr=$str->getAttribute('name');
$data=$str->textContent;
交换机($attr){
案件编号:
$id=$data;
打破
“标题”一案:
$title=$data;
打破
案例“描述”:
$description=$data;
打破
} 
}

这是我对如何突出显示搜索结果感到困惑的代码。你能帮我吗?

你不必在PHP中手动突出显示Solr中的文档

执行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>
DOM的问题在于,当请求
$node->nodeValue
时,它会剥离HTML/XML标记,因此您高亮显示的标记(
)将被剥离。您必须使用递归函数将其与所有标记一起提取,或者更简单的解决方案是使用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);
}
$sxml=newsimplexmlement(文件获取内容('doc.xml');
$nodes=$sxml->xpath(//lst[@name='highlighting']]/lst[@name='myDocumentId']/*”;
foreach($node作为$node){
$field=$node->attributes()->name;
$tag=$node->getName();
$value=$node->asXML();
$value=preg_replace(“/(|)/”,“”,$value);
}

我在我的函数solrQuery()中使用了突出显示功能。请参见$query=“?q=“.trim(urlencode($q))。&version=2.2&start=0&rows=10&indent=on&hl=true&hl.fl=title”;问题是如何在我的php代码中实现?我的答案底部有一个使用SimpleXML的示例。
//lst[@name='highlighting']/lst[@name='myDocumentId']/*
$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);
}