2010-10-30 87 views
1

我使用SOLR和Tomcat servlet容器開發了搜索頁面。使用PHP代碼,我將搜索查詢發佈到solrQuery()函數中,並在此函數中定義了查詢參數,如下所示。如何突出顯示使用Apache SOLR和PHP代碼的搜索結果

$查詢= TRIM(用urlencode($ Q)) &版= 2.2 &開始= 0 &行= 10 &縮進=上& HL =真& hl.fl =標題「 」Q =?「。

我已經過了強調「HL =真& hl.fl =標題」參數。我不知道如何分析/顯示高亮結果我的搜索頁面?

任何一個能幫助我嗎?

回答

3

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

在XML響應的結果開始時,您會看到一個帶有包含搜索結果的子「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> 

在與resutls XML響應結束後,你會看到一個名爲「突出」一個「樂善堂」節點。您會注意到,在每個節點中,您會看到一個名爲您爲文檔選擇的唯一標識符的子節點「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; 
           } 

         } 

        } 
       } 

讓我知道您的想法!

+0

非常感謝您的回覆。我用我的代碼作爲新問題張貼了我的回覆。你可以請審查它。 – prabu 2010-11-03 11:53:11

相關問題