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

Я разработал страницу поиска, используя SOLR с контейнером сервлетов Tomcat. Используя PHP-код, я отправляю поисковый запрос в функцию solrQuery () и в этой функции определил параметр запроса следующим образом.

$ query = "? Q =". Trim (urlencode ($ q)) & Версия = 2,2 & начать = 0, & = 10 строк и отступа = на & гл = истина & hl.fl = название ";

Я передал выделенные параметры "hl = true & hl.fl = title". Я не знаю, как анализировать / отображать выделенные результаты на странице поиска?

Может ли кто-нибудь мне помочь?

1 Ответ

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

Способ подсвечивания в Solr работает следующим образом:

В начале XML-ответа с результатами вы видите узел "result" с дочерними узлами "doc", которые содержат результаты вашего поиска. Примерно так:

 <doc>
  <str name="body">Merge transfer will merge one item with another. The new item can be either from same location or from different location. Merge transfer directions:  Open your Paper Tiger Online and select the database. Select item(s) you want to merge except for the one you want to merge the items into, click on Transfer and select Merge. A pop up will be opened asking New Location, once you select the location, the items in the location will be loaded in to the “File to Merge”.  Select a file in the “File to Merge” list. Choose whether you want to be reminded to move this file or not  Click Merge File  Add any additional keywords, notes, action date, change category (if necessary)  Click Merge Item button  If you chose to be reminded, you'll need to click the Confirm box to confirm the merge, then the merge will happen. (You can also cancel the merge from the Confirm page) </str>
  <str name="current-tags"/>
  <str name="id">141156</str>
  <str name="title">What is a merge transfer? How do I merge files?</str>
 </doc>

В конце ответа XML с результатами поиска вы увидите узел "lst" с именем "подсветка". Вы заметите, что внутри каждого узла вы увидите дочерний узел "lst" с именем уникального идентификатора, который вы выбрали для своего документа. Как то так:

<lst name="141154">
  <arr name="body">
    <str>Transfers are used to move or &lt;em&gt;merge&lt;/em&gt; the items from one location and another location and creating duplicates items in the locations. You might want to move and item from Action to Reference or Archive to an off-site location. You would want to move the item in Paper Tiger to ensure you can find it</str>
  </arr>
</lst>

Самый простой способ сделать это - сначала пройтись по узлу «результатов» и установить мои переменные в соответствии с содержимым результатов поиска как таковым. Затем в цикле, отображающем каждый элемент, я перебираю «выделенный» узел и ищу идентификатор элемента, чтобы увидеть, нашел ли я соответствие. Если совпадение найдено, я перезапишу содержимое исходных переменных выделенным содержимым.

Таким образом, вы будете отображать результаты, если выделенное совпадение найдено или нет.

    cURL_address($curl_url);

$xml = new SimpleXMLElement($data);

    foreach ($xml->children() as $node) {

        $arr = $node->attributes();   // returns an array
        $no_results = FALSE;

        //When no results are found

        if ($arr["name"] == "response" && $arr["numFound"] == 0) {

            echo "No results found for '". $query ."'";
            $no_results = TRUE;

        }

        if ($arr["name"] == "response") {

            if ($no_results != TRUE) {
                echo "<h4 id=\"search_results\">Search results for '".$query."'</h4>";
            } 

            foreach ($node->doc as $response) {

                //Initially set all the variables to the non-highlighted content

                $entry_title = $response->str[3];
                $entry_body = substr($response->str[0], 0, 300)."&#8230;";
                $entry_id = $response->str[2];
                $entry_tags = $response->str[1];

                //logic to see if we need to add ellipsis to start/end of body
                $orig_body_beggining = substr($response->str[0], 0, 10);
                $orig_body_end = substr($response->str[0], -10);

                //Now loop through every highlighted field to see if we have a node that matches the original item's ID

                foreach ($xml->lst[1]->lst as $hl_data) {

                    $arr2 = $hl_data->attributes();   // returns an array

                    $hl_arr = $arr2["name"];

                    if ((string)$entry_id == (string)$hl_arr) {

                        foreach ($hl_data->arr as $hl_content) {

                            $arr3 = $hl_content->attributes();

                            //Use a switch to overwrite existing variables if a new one exists that is highlighted

                            switch($arr3['name']) { // Get attributes as element indices
                                case 'body':
                                    $f_ellip = NULL;
                                    $l_ellip = NULL;
                                    if ($orig_body_beggining != substr((string)$hl_content->str, 0, 10)) {
                                        $f_ellip = "&#8230; ";
                                    }
                                    if ($orig_body_end != substr((string)$hl_content->str, 0, -10)) {
                                        $l_ellip = " &#8230;";
                                    }
                                    $entry_body = $f_ellip.(string)$hl_content->str.$l_ellip;
                                    break;
                                case 'title':
                                    $entry_title = (string)$hl_content->str;
                                    break;
                                case 'current-tags':
                                    $entry_tags = (string)$hl_content->str;
                                    break;
                                }

                        }

                    }
                }

Дайте мне знать, что вы думаете!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...