【问题标题】:How to Highlighting Search Results Using Apache SOLR with PHP code如何使用带有 PHP 代码的 Apache SOLR 突出显示搜索结果
【发布时间】:2010-10-30 13:35:17
【问题描述】:

我使用 SOLR 和 Tomcat servlet 容器开发了搜索页面。使用 PHP 代码,我将搜索查询发布到 solrQuery() 函数中,并在此函数中定义了查询参数,如下所示。

$query = "?q=".trim(urlencode($q)) &version=2.2&start=0&rows=10&indent=on&hl=true&hl.fl=title";

我已通过突出显示的“hl=true&hl.fl=title”参数。我不知道如何在我的搜索页面中解析/显示突出显示的结果?

谁能帮帮我?

【问题讨论】:

    标签: php solr


    【解决方案1】:

    Solr 中突出显示的工作方式如下:

    在带有结果的 XML 响应的开头,您会看到一个带有子“doc”节点的“result”节点,其中包含您的搜索结果。像这样的:

     <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 响应的末尾,您将看到一个名为“highlighting”的“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>
    

    对我来说最简单的方法就是先遍历“结果”节点并将我的变量设置为搜索结果的内容。然后,在显示每个项目的循环中,我循环通过“突出显示”节点并搜索项目的 ID 以查看是否找到匹配项。如果找到匹配项,我将用突出显示的内容覆盖原始变量的内容。

    这样,无论是否找到突出显示的匹配项,您都会显示结果。

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

    让我知道你的想法!

    【讨论】:

    • 非常感谢您的热情回复。我已将我的回复发布为我的代码的新问题。请您检查一下。
    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    相关资源
    最近更新 更多