1. 程式人生 > >lucene中的高亮

lucene中的高亮

這裡我們搜尋的內容是“一步一步跟我學習lucene”,搜尋引擎展示的結果中對使用者的輸入資訊進行了配色方面的處理,這種區分正常文字和輸入內容的效果即是高亮顯示;

這樣做的好處:

  • 視覺上讓人便於查詢有搜尋對應的文字塊;
  • 介面展示更友好;

lucene提供了highlighter外掛來體現類似的效果;

highlighter對查詢關鍵字高亮處理;

highlighter包包含了用於處理結果頁查詢內容高亮顯示的功能,其中Highlighter類highlighter包的核心元件,藉助Fragmenter, fragment Scorer, 和Formatter等類來支援使用者自定義高亮展示的功能;

示例程式

這裡邊我利用了之前的做的目錄檔案索引

  1. package com.lucene.search.util;  
  2. import java.io.IOException;  
  3. import java.io.StringReader;  
  4. import java.util.concurrent.ExecutorService;  
  5. import java.util.concurrent.Executors;  
  6. import org.apache.lucene.analysis.Analyzer;  
  7. import org.apache.lucene.analysis.TokenStream;  
  8. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  9. import org.apache.lucene.document.Document;  
  10. import org.apache.lucene.index.Term;  
  11. import org.apache.lucene.search.IndexSearcher;  
  12. import org.apache.lucene.search.ScoreDoc;  
  13. import org.apache.lucene.search.TermQuery;  
  14. import org.apache.lucene.search.TopDocs;  
  15. import org.apache.lucene.search.highlight.Highlighter;  
  16. import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;  
  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. import org.apache.lucene.util.BytesRef;  
  21. publicclass HighlighterTest {  
  22.       publicstaticvoid main(String[] args) {  
  23.         IndexSearcher searcher;  
  24.         TopDocs docs;   
  25.         ExecutorService service = Executors.newCachedThreadPool();  
  26.         try {  
  27.             searcher = SearchUtil.getMultiSearcher("index", service);  
  28.             Term term = new Term("content",new BytesRef("lucene"));  
  29.             TermQuery termQuery = new TermQuery(term);  
  30.             docs = SearchUtil.getScoreDocsByPerPage(130, searcher, termQuery);  
  31.             ScoreDoc[] hits = docs.scoreDocs;  
  32.             QueryScorer scorer = new QueryScorer(termQuery);  
  33.             SimpleHTMLFormatter simpleHtmlFormatter = new SimpleHTMLFormatter("<B>","</B>");//設定高亮顯示的格式<B>keyword</B>,此為預設的格式  
  34.             Highlighter highlighter = new Highlighter(simpleHtmlFormatter,scorer);     
  35.             highlighter.setTextFragmenter(new SimpleFragmenter(20));//設定每次返回的字元數
  36.             Analyzer analyzer = new StandardAnalyzer();  
  37.             for(int i=0;i<hits.length;i++){     
  38.                 Document doc = searcher.doc(hits[i].doc);     
  39.                 String str = highlighter.getBestFragment(analyzer, "content", doc.get("content")) ;  
  40.                 System.out.println(str);     
  41.             }     
  42.         } catch (IOException e1) {  
  43.             // TODO Auto-generated catch block
  44.             e1.printStackTrace();  
  45.         } catch (InvalidTokenOffsetsException e) {  
  46.             // TODO Auto-generated catch block
  47.             e.printStackTrace();  
  48.         }finally{  
  49.             service.shutdown();  
  50.         }  
  51.     }  
  52. }  

lucene的highlighter高亮展示的原理:

  • 根據Formatter和Scorer建立highlighter物件,formatter定義了高亮的顯示方式,而scorer定義了高亮的評分;

評分的演算法是先根據term的評分值獲取對應的document的權重,在此基礎上對文字的內容進行輪詢,獲取對應的文字出現的次數,和它在term對應的文字中出現的位置(便於高亮處理),評分並分詞的演算法為:

  1. publicfloat getTokenScore() {  
  2.     position += posIncAtt.getPositionIncrement();//記錄出現的位置
  3.     String termText = termAtt.toString();  
  4.     WeightedSpanTerm weightedSpanTerm;  
  5.     if ((weightedSpanTerm = fieldWeightedSpanTerms.get(  
  6.               termText)) == null) {  
  7.       return0;  
  8.     }  
  9.     if (weightedSpanTerm.positionSensitive &&  
  10.           !weightedSpanTerm.checkPosition(position)) {  
  11.       return0;  
  12.     }  
  13.     float score = weightedSpanTerm.getWeight();//獲取權重
  14.     // found a query term - is it unique in this doc?
  15.     if (!foundTerms.contains(termText)) {//結果排重處理
  16.       totalScore += score;  
  17.       foundTerms.add(termText);  
  18.     }  
  19.     return score;  
  20.   }  

formatter的原理為:對搜尋的文字進行判斷,如果scorer獲取的totalScore不小於0,即查詢內容在對應的term中存在,則按照格式拼接成preTag+查詢內容+postTag的格式

詳細演算法如下:

  1. public String highlightTerm(String originalText, TokenGroup tokenGroup) {  
  2.     if (tokenGroup.getTotalScore() <= 0) {  
  3.       return originalText;  
  4.     }  
  5.     // Allocate StringBuilder with the right number of characters from the
  6.     // beginning, to avoid char[] allocations in the middle of appends.
  7.     StringBuilder returnBuffer = new StringBuilder(preTag.length() + originalText.length() + postTag.length());  
  8.     returnBuffer.append(preTag);  
  9.     returnBuffer.append(originalText);  
  10.     returnBuffer.append(postTag);  
  11.     return returnBuffer.toString();  
  12.   }  

其預設格式為“<B></B>”的形式;

  • Highlighter根據scorer和formatter,對document進行分析,查詢結果呼叫getBestTextFragments,TokenStream tokenStream,String text,boolean mergeContiguousFragments,int maxNumFragments),其過程為
  1. scorer首先初始化查詢內容對應的出現位置的下標,然後對tokenstream新增PositionIncrementAttribute,此類記錄單詞出現的位置;
  2. 對文字內容進行輪詢,判斷查詢的文字長度是否超出限制,如果超出文字長度提示過長內容;
  3. 如果獲取到指定的文字,先對單次查詢的內容進行內容的擷取(擷取值根據setTextFragmenter指定的值決定),再呼叫formatter的highlightTerm方法對文字進行重新構建
  4. 在本次輪詢和下次單詞出現之前對文字內容進行處理

查詢工具類

  1. package com.lucene.search.util;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import java.nio.file.Paths;  
  5. import java.util.Set;  
  6. import java.util.concurrent.ExecutorService;  
  7. import org.apache.lucene.analysis.Analyzer;  
  8. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  9. import org.apache.lucene.document.Document;  
  10. import org.apache.lucene.index.DirectoryReader;  
  11. import org.apache.lucene.index.IndexReader;  
  12. import org.apache.lucene.index.MultiReader;  
  13. import org.apache.lucene.index.Term;  
  14. import org.apache.lucene.queryparser.classic.ParseException;  
  15. import org.apache.lucene.queryparser.classic.QueryParser;  
  16. import org.apache.lucene.search.BooleanQuery;  
  17. import org.apache.lucene.search.IndexSearcher;  
  18. import org.apache.lucene.search.MatchAllDocsQuery;  
  19. 相關推薦

    如何讓vue文件中的代碼在Sublime Text 3中高和智能提示

    sta sublime light 彩色 沒有 智能提示 tex syn package 大家寫在Sublime Text 3中編寫vue文件時,會發現沒有代碼智能提示,清一色的黑底白字,不會像html、js一樣變成彩色,給我們帶來了很大的不便。所以需要安裝一款叫作Vue

    vue文件在編輯器Sublime Text3中高

    pack nta 方法 In tro 提高 ext3 ins text 編寫代碼時,代碼在編輯器中顯示高亮,一方面,在感官方面使人覺得很舒服;另一方面,還可以提高開發效率。下面簡單介紹vue文件在Sublime Text3 中高亮的vue插件的安裝方法:

    VS程式設計,編輯WPF過程中,點選設計器中介面某一控制元件,在XAML中高突出顯示相應的控制元件程式碼的設定方法。

    在編輯製件WPF過程中,當介面中控制元件較多時,可通過點選設計器中具體的控制元件,從而中在xaml程式碼視窗中快速跳轉到對應的部分。為了突出顯示該部分控制元件程式碼的名稱,方便視覺上直觀的觀察到被選中的控制元件對應的XAML程式碼,可以在VS中設定:選中控制元件後,高亮顯示對應的XAML

    vue檔案在編輯器Sublime Text3中高

    編寫程式碼時,程式碼在編輯器中顯示高亮,一方面,在感官方面使人覺得很舒服;另一方面,還可以提高開發效率。下面簡單介紹vue檔案在Sublime Text3 中高亮的vue外掛的安裝方法:         第一步:安裝Package Control         第二步:執

    如何在搜尋頁面中高顯示關鍵字

     上個周的 高亮顯示關鍵字問題困擾了我一段時間,還好在週五解決了,而且顯示效果也還不錯. 通過呼叫BEAN的字串替換功能,可以實現關鍵字的高亮顯示. 以下是JAVABEAN Replace.java package util; public class Replace {  

    基於vue的實時搜尋,在結果中高顯示關鍵詞

    1)利用oninput屬性來觸發搜素功能  2)利用RegExp來對字串來全域性匹配關鍵字,利用replace方法來對匹配的關鍵字進行嵌入高亮的<span class="gaoliang">標籤,最後利用v-html來嵌入html標籤來達到關鍵字高亮顯示程式碼  

    如何讓vue檔案中的程式碼在Sublime Text 3中高

    大家寫在Sublime Text 3中編寫vue檔案時,會發現沒有程式碼智慧提示,清一色的黑底白字,不會像html、js一樣變成彩色,給我們帶來了很大的不便。所以需要安裝一款叫作Vue Syntax Highlight的外掛,它不僅可以使程式碼高亮起來,還能進行

    Lucene顯示及中文分詞

    直接demo,不廢話 建立一個Maven 在pom.xml貼上依賴 <dependencies> <dependency> <groupId>org.apache.lucene</groupId> <art

    richTextBox中高顯示選中字串或文字

    最近開發程式需要對一段文字中的某個字串進行高亮顯示,網上找了下資料,例項驗證如下: private void 突出顯示(string 要查詢字串) { //首先找到要查詢字串的起始位置 int 開始位置=richTextBox短語顯示.Find(要查詢字串

    3.6 Lucene基本檢索+關鍵詞高+分頁

    trac 16px b- 標註 enter author amp 影響 重要 3.2節我們已經運行了一個Lucene實現檢索的小程序,這一節我們將以這個小程序為例,講一下Lucene檢索的基本步驟,同時介紹關鍵詞高亮顯示和分頁返回結果這兩個有用的技巧。 一、Lucene檢索

    Lucene筆記35-Lucene的擴充套件-高索引檔案

    一、對索引檔案新增高亮 現在我們有一些索引檔案,怎麼對這些索引檔案新增高亮呢?首先需要根據搜尋域和值找到這篇文件,然後通過文件獲取域值,再將域值交給highlighter進行加工並返回,這個時候,返回的值就是新增過高亮的了。 二、程式碼展示 package com.wsy; imp

    Lucene筆記34-Lucene的擴充套件-高基礎

    一、高亮顯示用到的類 Fragmenter:拿到一個字串之後,對字串進行分段 QueryScorer:查詢評分,將評分最高的展示給使用者 Encoder:顯示出來的文字有兩種,一種是SimpleEncode(忽略掉HTML標籤),一種是DefaultEncode(展示HTM

    lucene 中文分詞和結果高顯示

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

    lucene中文分詞以及高顯示

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

    Lucene學習篇之高搜尋結果

    前言: import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexRe

    如何使用 Lucene 做網站高搜尋功能?

    作者 | 倪升武 責編 | 胡巍巍 現在基本上所有網站都支援搜尋功能,現在搜尋的工具有很多,比如Solr、Elasticsearch,它們都是基於 Lucene 實現的,各有各的使用場景。Lucene 比較靈活,中小型專案中使用的比較多,我個人也比較喜歡用。

    Lucene學習之高顯示

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

    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”,搜尋引擎展示的結果中對使用者的輸入資訊進行了配色方