Как выделить результаты поиска с помощью Apache SOLR с помощью PHP-кода - PullRequest
2 голосов
/ 03 ноября 2010

Любой поможет мне выделить результаты поиска Solr. Я использую DomDocument для анализа результатов XML.

Здесь у меня есть образец документа, как показано ниже.

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

....

На моей странице результатов я отображаю данные, как показано ниже,

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

Вот код, который я запутался, как выделить результаты поиска. Вы можете помочь мне в этом?

1 Ответ

3 голосов
/ 03 ноября 2010

Вам не нужно выделять вручную документы из Solr в 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>

Теперь все, что вам нужно сделать, это соответствоватьдокумент id в result и lst name="highlighting" (использование Xpath, вероятно, самый простой способ):

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

Проблема с DOM заключается в том, что при запросе * он удаляет теги HTML / XML1015 *, поэтому вы выделяете теги (<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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...