1. 程式人生 > >Lucene關鍵字高亮顯示

Lucene關鍵字高亮顯示

  在 Lucene的org.apache.lucene.search.highlight包中提供了關於高亮顯示檢索關鍵字的工具。使用百度、Google 搜尋的時候,檢索結果顯示的時候,在摘要中實現與關鍵字相同的詞條進行高亮顯示,百度和Google指定紅色高亮顯示。

有了Lucene提供的高亮顯示的工具,可以很方便地實現高亮顯示的功能。

高亮顯示,就是根據使用者輸入的檢索關鍵字,檢索找到該關鍵字對應的檢索結果檔案,提取對應於該檔案的摘要文字,然後根據設定的高亮格式,將格式寫入到摘要文字中對應的與關鍵字相同或相似的詞條上,在網頁上顯示出來,該摘要中的與關鍵字有關的文字就會以高亮的格式顯示出來。

Lucene中org.apache.lucene.search.highlight.SimpleHTMLFormatter類可以構造一個高亮格式,這是最簡單的構造方式,例如:

SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");

構造方法宣告為public SimpleHTMLFormatter(String preTag, String postTag),因為這種高亮格式是依賴於網頁檔案的,HTML檔案中是以標記(tag)來標識的,即存在一個preTag和一個postTag。

上面構造的高亮格式是摘要中出現的關鍵字使用紅色來顯示,區分其它文字。

通過構造好的高亮格式物件,來構造一個org.apache.lucene.search.highlight.Highlighter例項,然後 根據對檢索結果得到的Field的文字內容(這裡是指摘要文字)進行切分,找到與檢索關鍵字相同或相似的詞條,將高亮格式加入到摘要文字中,返回一個新 的、帶有格式的摘要文字,在網頁上就可以呈現高亮顯示。

下面實現一個簡單的例子,展示實現高亮顯示的處理過程。

測試類如下所示:

  1. package org.shirdrn.lucene.learn.highlight;
  2. import java.io.IOException;
  3. import java.io.StringReader;
  4. import net.teamhot.lucene.ThesaurusAnalyzer;
  5. import org.apache.lucene.analysis.Analyzer;
  6. import org.apache.lucene.analysis.TokenStream;
  7. import org.apache.lucene.document.Document;
  8. import org.apache.lucene.document.Field;
  9. import org.apache.lucene.index.CorruptIndexException;
  10. import org.apache.lucene.index.IndexWriter;
  11. import org.apache.lucene.queryParser.ParseException;
  12. import org.apache.lucene.queryParser.QueryParser;
  13. import org.apache.lucene.search.Hits;
  14. import org.apache.lucene.search.IndexSearcher;
  15. import org.apache.lucene.search.Query;
  16. import org.apache.lucene.search.highlight.Highlighter;
  17. import org.apache.lucene.search.highlight.QueryScorer;
  18. import org.apache.lucene.search.highlight.SimpleFragmenter;
  19. import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
  20. publicclass MyHighLighter {
  21. private String indexPath = "F://index";
  22. private Analyzer analyzer;
  23. private IndexSearcher searcher;
  24. public MyHighLighter(){
  25.    analyzer = new ThesaurusAnalyzer();
  26. }
  27. publicvoid createIndex() throws IOException {   // 該方法建立索引
  28.    IndexWriter writer = new IndexWriter(indexPath,analyzer,true);
  29.    Document docA = new Document();
  30.    String fileTextA = "因為火燒雲總是燃燒著消失在太陽衝下地平線的時刻,然後便是寧靜的自然的天籟,沒有誰會在這樣的時光的鏡片裡傷感自語,因為燦爛給人以安靜的舒適感。";
  31.    Field fieldA = new Field("contents", fileTextA, Field.Store.YES,Field.Index.TOKENIZED);
  32.    docA.add(fieldA);
  33.    Document docB = new Document();
  34.    String fileTextB = "因為帶有以傷痕為代價的美麗風景總是讓人不由地惴惴不安,緊接著襲面而來的抑或是病痛抑或是災難,沒有誰會能夠安逸著恬然,因為模糊讓人撕心裂肺地想吶喊。";
  35.    Field fieldB = new Field("contents", fileTextB, Field.Store.YES,Field.Index.TOKENIZED);
  36.    docB.add(fieldB);
  37.    Document docC = new Document();
  38.    String fileTextC = "我喜歡上了一個人孤獨地行遊,在夢與海洋的交接地帶熾烈燃燒著。"+
  39. "因為,一條孤獨的魚喜歡上了火焰的顏色,真是荒唐地不合邏輯。";
  40.    Field fieldC = new Field("contents", fileTextC, Field.Store.YES,Field.Index.TOKENIZED);
  41.    docC.add(fieldC);
  42.    writer.addDocument(docA);
  43.    writer.addDocument(docB);
  44.    writer.addDocument(docC);
  45.    writer.optimize();
  46.    writer.close();
  47. }
  48. publicvoid search(String fieldName,String keyword) throws CorruptIndexException, IOException, ParseException{   // 檢索的方法,並實現高亮顯示
  49.    searcher = new IndexSearcher(indexPath);
  50.    QueryParser queryParse = new QueryParser(fieldName, analyzer);     //   構造QueryParser,解析使用者輸入的檢索關鍵字
  51.    Query query = queryParse.parse(keyword);
  52.    Hits hits = searcher.search(query);
  53. for(int i=0;i<hits.length();i++){
  54.     Document doc = hits.doc(i);
  55.     String text = doc.get(fieldName);
  56.     SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>""</font>");   
  57.             Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));   
  58.             highlighter.setTextFragmenter(new SimpleFragmenter(text.length()));      
  59. if (text != null) {   
  60.                 TokenStream tokenStream = analyzer.tokenStream(fieldName,new StringReader(text));   
  61.                 String highLightText = highlighter.getBestFragment(tokenStream, text);
  62.                 System.out.println("★高亮顯示第 "+(i+1) +" 條檢索結果如下所示:");
  63.                 System.out.println(highLightText);   
  64.             }
  65.    }
  66.    searcher.close();
  67. }
  68. publicstaticvoid main(String[] args) {    // 測試主函式
  69.    MyHighLighter mhl = new MyHighLighter();
  70. try {
  71.     mhl.createIndex();
  72.     mhl.search("contents""因為");
  73.    } catch (CorruptIndexException e) {
  74.     e.printStackTrace();
  75.    } catch (IOException e) {
  76.     e.printStackTrace();
  77.    } catch (ParseException e) {
  78.     e.printStackTrace();
  79.    }
  80. }
  81. }

程式說明:

1、createIndex()方法:使用ThesaurusAnalyzer分析器為指定的文字建立索引。每個Document中都有一個 name為contents的Field。在實際應用中,可以再構造一一個name為path的Field,指定檢索到的檔案的路徑(本地路徑或者網路上 的連結地址)

2、根據已經建好的索引庫進行檢索。這首先需要解析使用者輸入的檢索關鍵字,使用QueryParser,必須與後臺使用的分析器相同,否則不能保證解析得到的查詢(由詞條構造)Query檢索到合理的結果集。

3、根據解析出來的Query進行檢索,檢索結果集儲存在Hits中。遍歷,提取每個滿足條件的Document的內容,程式中直接把它的內容當作 摘要內容,實現高亮顯示。在實際應用中,應該對應著一個提取摘要(或者檢索資料庫得到檢索關鍵字對應的結果集檔案的摘要內容)的過程。有了摘要以後,就可 以為摘要內容增加高亮格式。

4、如果提取結果集檔案的前N個字串作為摘要,只需要在 highlighter.setTextFragmenter(new SimpleFragmenter(text.length())); 中設定顯示摘要的字數,這裡顯示全部的文字作為摘要。

執行程式,結果如下所示:

詞庫尚未被初始化,開始初始化詞庫.
初始化詞庫結束。用時:3906毫秒;
共新增195574個詞語。
★高亮顯示第 1 條檢索結果如下所示:
<font color='red'>因為</font>火燒雲總是燃燒著消失在太陽衝下地平線的時刻,然後便是寧靜的自然的天籟,沒有誰會在這樣的時光的鏡片裡傷感自語,<font color='red'>因為</font>燦爛給人以安靜的舒適感。
★高亮顯示第 2 條檢索結果如下所示:
<font color='red'>因為</font>帶有以傷痕為代價的美麗風景總是讓人不由地惴惴不安,緊接著襲面而來的抑或是病痛抑或是災難,沒有誰會能夠安逸著恬然,<font color='red'>因為</font>模糊讓人撕心裂肺地想吶喊。
★高亮顯示第 3 條檢索結果如下所示:
我喜歡上了一個人孤獨地行遊,在夢與海洋的交接地帶熾烈燃燒著。<font color='red'>因為</font>,一條孤獨的魚喜歡上了火焰的顏色,真是荒唐地不合邏輯。

上面的檢索結果在HTML網頁中,就會高亮顯示關鍵字“因為”,顯示為紅色。

相關推薦

Lucene關鍵字顯示

  在 Lucene的org.apache.lucene.search.highlight包中提供了關於高亮顯示檢索關鍵字的工具。使用百度、Google 搜尋的時候,檢索結果顯示的時候,在摘要中實現與關鍵字相同的詞條進行高亮顯示,百度和Google指定紅色高亮顯示。 有了Lucene提供的高亮顯示

模糊查詢關鍵字顯示以及多個關鍵字的匹配定位

需求中我們經常會遇到模糊查詢的方式渲染資料,效果類似於下圖: js渲染資料的方式如下: var keyword = $("#searchSchool").val(); for(var i=0;i<data.schoolNames.length;i++){ var renderPa

當Eclipse的關鍵字顯示不小心被關閉之後......

1.在Eclipse的開發當中,雙擊某個關鍵字或變數,整個視窗中相同的內容會同時高亮顯示,這一小功能十分便利。 2.但有時候會發現這個功能會莫名其妙的被關掉,雖然是一個小問題,但也“牙疼不是病,疼起

搜尋關鍵字顯示方法

{                        //sqlstr 待查詢的關鍵字            //str 已經查詢到帶有關鍵字的字串            int len=sqlkey.Length;            int len1=str.Length;                 

js程式碼實現查詢關鍵字顯示

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>程式碼實現查詢關鍵字高亮顯示</title> <style type="

Android中TextView的文字內容中指定關鍵字顯示

讓TextView的文字中指定關鍵字高亮顯示的工具類 public class HighLightKeyWordUtil { /** * @param color 關鍵字

js 搜尋關鍵字,文章中關鍵字顯示

實現程式碼如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-tran

WPF搜尋關鍵字顯示

目標:在WPF中,對lucene.net進行全文檢索後的結果中包含的關鍵字進行高亮顯示。 檢索結果中的關鍵字高亮顯示,在網頁中顯示是很簡單的,lucene中加標籤樣式就可以了,可是在WPF中就不行了。 我在WPF中用GridControl顯示搜尋結果列表,GridContr

從寫JTextPane元件 實現關鍵字顯示

package my2; import java.util.StringTokenizer; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.text.

搜尋完後,讓搜尋後的關鍵字顯示

繫結的時候,比如你的資料來源是datatableif(keyword.Text != "" && keyword.Text != null ){for(int iloop =0 ;iloop < dstemp.Tables[0].Rows.Count ;

javascript 關鍵字顯示實現程式碼

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>關鍵字高亮顯示</title> </head>

lucene 中文分詞和結果顯示

要使用中文分詞要加入新的依賴  smartcn <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-smartcn --> <dependency>   &

lucene中文分詞以及顯示

這篇部落格介紹一下如何在Lucene中使用中文分詞以及高亮顯示查詢結果中與搜尋匹配的部分 1.在pom.xml中加入相關依賴 <!-- 高亮顯示 --> <dependency> <groupId&g

自定義函式實現百度搜索關鍵字在網頁中匹配字元顯示效果

    自定義函式實現類似百度搜索關鍵字在網頁中匹配字元高亮顯示效果。完全用php來實現簡單但很有趣的效果。函式如下: <?php /**     * @param $wd 搜尋的詞語

Lucene學習之顯示

在搜尋引擎中我們經常會看到這樣的情景: 紅色部分我們稱之為高亮顯示,lucene提供了HighLighter模組來實現這一功能。 高亮顯示模組通常包含兩個獨立的功能,首先是動態拆分,就是從匹配搜尋的大量文字中選取一小部分句子。第二個內容就是高亮顯示。 我們先來看下高亮顯示的原理:

VUE:vue 搜尋結果顯示關鍵字(父+子)

1. 需要解決的問題 父元件將搜尋的欄位傳到子元件 子元件接受資料,正則匹配,並替換欄位 2. 具體程式碼 父元件程式碼 <template> <div> <div v-if="showMe"> <

Lucene多欄位查詢&顯示

在百度搜索的時候,查詢的關鍵詞會高亮顯示 在搜尋一個關鍵詞的時候,有可能這個關鍵詞在title和content中,搜尋的時候要把結果全部顯示出來 例項說明 package com.bart.lucene.mutilseacher; import

全文檢索Lucene(三)--中文分詞與顯示

一、中文分詞smartcn 二、檢索結果高亮顯示實現        首先,建立maven專案,新增相關依賴。<dependencies> <dependency> <groupId>org.apache.lucene</g

一步一步跟我學習lucene(11)---lucene搜尋之顯示highlighter

highlighter介紹 這幾天一直加班,部落格有三天沒有更新了,望見諒;我們在做查詢的時候,希望對我們自己的搜尋結果與搜尋內容相近的地方進行著重顯示,就如下面的效果 這裡我們搜尋的內容是“一步一步跟我學習lucene”,搜尋引擎展示的結果中對使用者的輸入資訊進行了配色方

JQuery:頁面文字匹配檢索關鍵字 並加紅字顯示

/**頁面上有一行標籤定義內容如下  a中顯示的文字可以自己定義**/ <div class="right_a_a1"><a href="#">...網際網路行業...</a></div> <script languag