亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Lucene基礎(三)--中文分詞及高亮顯示

2019-11-14 15:23:15
字體:
來源:轉載
供稿:網友

Lucene分詞器及高亮

分詞器

在lucene中我們按照分詞方式把文檔進行索引,不同的分詞器索引的效果不太一樣,之前的例子使用的都是標準分詞器,對于英文的效果很好,但是中文分詞效果就不怎么樣,他會按照漢字的字直接分詞,沒有詞語的概念。

使用分詞的地方只需要把Analyzer實例化成我們第三方的分詞器即可

中文分詞有很多,這里使用IKAnalyzer 為例, 
下載地址 https://git.oschina.net/wltea/IK-Analyzer-2012FF 現在下來后里面有一篇教程。

高亮

導入lucene-highlighter-xxx.jar 在對查詢出來的結果實現高亮顯示

// 關鍵字高亮顯示的html標簽,需要導入lucene-highlighter-xxx.jar

  SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");

  Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));

  for (int i = 0; i < hits.length; i++) {

    Document doc = isearcher.doc(hits[i].doc);

    // 內容增加高亮顯示

    TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(doc.get("content")));

    String content = highlighter.getBestFragment(tokenStream, doc.get("content")); System.out.PRintln(content);

  }

 

Lucene中文分詞器

package lucene_demo04;

import java.io.IOException;
import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

/**
* 中文分詞,IKAnalayzer,對索引結果實現高亮顯示
*
* @author YipFun
*/
public class LuceneDemo04
{
  private static final Version version = Version.LUCENE_4_9;
  private Directory directory = null;
  private DirectoryReader ireader = null;
  private IndexWriter iwriter = null;
  private IKAnalyzer analyzer;

  // 測試數據
  private String[] content = { "你好,我是中共人", "中華人民共和國", "中國人民從此站起來了", "Lucene是一個不錯的全文檢索的工具", "全文檢索中文分詞" };

  /**
   * 構造方法
   */
  public LuceneDemo04()
  {
    directory = new RAMDirectory();
  }

  private IKAnalyzer getAnalyzer()
  {
    if (analyzer == null)
    {
      return new IKAnalyzer();
    } else
    {
      return analyzer;
    }
  }

  /**
  * 創建索引
  */
  public void createIndex()
  {
    Document doc = null;
    try
    {
      IndexWriterConfig iwConfig = new IndexWriterConfig(version, getAnalyzer());
      iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
      iwriter = new IndexWriter(directory, iwConfig);
      for (String text : content)
      {
      doc = new Document();
      doc.add(new TextField("content", text, Field.Store.YES));
      iwriter.addDocument(doc);
    }

  } catch (IOException e)
  {
    e.printStackTrace();
  } finally
  {
  try
  {
    if (iwriter != null)
    iwriter.close();
  } catch (IOException e)
  {
    e.printStackTrace();
  }
  }

  }

  public IndexSearcher getSearcher()
  {
    try
    {
      if (ireader == null)
      {
        ireader = DirectoryReader.open(directory);
      } else
      {
        DirectoryReader tr = DirectoryReader.openIfChanged(ireader);
        if (tr != null)
        {
          ireader.close();
          ireader = tr;
        }
      }
      return new IndexSearcher(ireader);
    } catch (CorruptIndexException e)
    {
      e.printStackTrace();
    } catch (IOException e)
    {
      e.printStackTrace();
    }
    return null;
  }

  public void searchByTerm(String field, String keyWord, int num) throws InvalidTokenOffsetsException
  {
    IndexSearcher isearcher = getSearcher();
    Analyzer analyzer = getAnalyzer();
    // 使用QueryParser查詢分析器構造Query對象
    QueryParser qp = new QueryParser(version, field, analyzer);
    // 這句所起效果?
    qp.setDefaultOperator(QueryParser.OR_OPERATOR);
    try
    {
      Query query = qp.parse(keyword);
      ScoreDoc[] hits;

      // 注意searcher的幾個方法
      hits = isearcher.search(query, null, num).scoreDocs;

      // 關鍵字高亮顯示的html標簽,需要導入lucene-highlighter-xxx.jar
      SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");
      Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));

      for (int i = 0; i < hits.length; i++)
      {
        Document doc = isearcher.doc(hits[i].doc);
        // 內容增加高亮顯示
        TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(doc.get("content")));
        String content = highlighter.getBestFragment(tokenStream, doc.get("content"));
        System.out.println(content);
      }

    } catch (IOException e)
    {
      e.printStackTrace();
    } catch (ParseException e)
    {
      e.printStackTrace();
    }
  }

  /**
  * 使用過濾器查詢
  *
  * @param field
  * @param keyword
  * @param num
  * @throws InvalidTokenOffsetsException
  */
  public void searchByTermFilter(String field, String keyword, int num) throws InvalidTokenOffsetsException
  {
    IndexSearcher isearcher = getSearcher();
    Analyzer analyzer = getAnalyzer();
    // 使用QueryParser查詢分析器構造Query對象
    QueryParser qp = new QueryParser(version, field, analyzer);
    // 這句所起效果?
    qp.setDefaultOperator(QueryParser.OR_OPERATOR);
    try
    {
      Query query = qp.parse(keyword);
      Query q2 = qp.parse("全文檢索");
      ScoreDoc[] hits;

      QueryWrapperFilter filter = new QueryWrapperFilter(q2);
      // 注意searcher的幾個方法
      hits = isearcher.search(query, filter, num).scoreDocs;

      // 關鍵字高亮顯示的html標簽,需要導入lucene-highlighter-xxx.jar
      SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");
      Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));

      for (int i = 0; i < hits.length; i++)
      {
        Document doc = isearcher.doc(hits[i].doc);
        // 內容增加高亮顯示
        TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(doc.get("content")));
        String content = highlighter.getBestFragment(tokenStream, doc.get("content"));
        System.out.println(content);
      }

    } catch (IOException e)
    {
      e.printStackTrace();
    } catch (ParseException e)
    {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) throws InvalidTokenOffsetsException
  {
    System.out.println("start");
    LuceneDemo04 ld = new LuceneDemo04();
    ld.createIndex();
    long start = System.currentTimeMillis();
    ld.searchByTerm("content", "人民", 500);
    System.out.println("end search use " + (System.currentTimeMillis() - start) + "ms");
  }

}

運行結果:

 

start 加載擴展詞典:ext.dic

加載擴展停止詞典:stopword.dic

中華<span style='color:red'>人民</span>共和國

中國<span style='color:red'>人民</span>從此站起來了

end search use 129ms


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91午夜理伦私人影院| 亚洲午夜国产成人av电影男同| 国产欧美一区二区| 国产精品综合久久久| 国产不卡精品视男人的天堂| 亚洲色图日韩av| 亚洲一区二区久久久久久| 亚洲级视频在线观看免费1级| 精品久久久视频| 狠狠做深爱婷婷久久综合一区| 日韩网站在线观看| 国产精品一区二区三| 91精品在线观看视频| 久久国产精品首页| 日韩高清免费观看| 亚洲社区在线观看| 欧美激情在线播放| 欧美一级淫片aaaaaaa视频| 亚洲欧洲第一视频| 欧美成年人在线观看| 亚洲欧洲中文天堂| 国产精品一区二区三区免费视频| 成人欧美一区二区三区黑人| 国产精品ⅴa在线观看h| 国产成人精品久久二区二区| 国产成+人+综合+亚洲欧美丁香花| 日韩最新在线视频| 午夜精品久久久久久99热| 日韩在线视频一区| 精品中文视频在线| 国产一区二区av| 69久久夜色精品国产69乱青草| 亚洲第一福利视频| 欧美激情喷水视频| 久久久国产视频| 国产精品久久久久久久久久小说| 亚洲一区二区久久久久久| 国产成人免费av| 欧美日韩在线视频首页| 国产偷亚洲偷欧美偷精品| 久久久国产精品免费| 91超碰中文字幕久久精品| 亚洲第一偷拍网| 日韩中文字幕免费视频| 色综合男人天堂| 国产精品丝袜白浆摸在线| 亚洲一区二区三区久久| 亚洲精品99999| 欧美乱人伦中文字幕在线| 欧美精品第一页在线播放| 国产午夜精品久久久| 国产精品视频成人| 狠狠操狠狠色综合网| 亚洲图中文字幕| 国产精品久久久久久亚洲影视| 97在线精品视频| 浅井舞香一区二区| 91社区国产高清| 欧美精品一二区| 国产成人在线一区| 日韩欧美黄色动漫| 色综合久久久久久中文网| 91嫩草在线视频| 欧美午夜视频一区二区| 美女啪啪无遮挡免费久久网站| 精品久久久久久亚洲精品| 亚洲欧美国产精品久久久久久久| 欧美丰满老妇厨房牲生活| 伊人久久五月天| 欧美大尺度激情区在线播放| 777精品视频| 国模gogo一区二区大胆私拍| 色99之美女主播在线视频| 亚洲另类激情图| 国产69精品99久久久久久宅男| 色999日韩欧美国产| 亚洲片国产一区一级在线观看| 精品国产精品三级精品av网址| 亚洲精品美女视频| 亚洲人成网站999久久久综合| 在线视频精品一| 国产精品成人国产乱一区| 日韩精品中文字幕久久臀| 日韩在线观看网址| 国产精品三级久久久久久电影| 亚洲欧美激情四射在线日| 亚洲国产精品美女| 91深夜福利视频| 91理论片午午论夜理片久久| 日韩欧美中文第一页| 91社区国产高清| 欧美日韩成人免费| 日本一本a高清免费不卡| 日韩免费黄色av| 欧美人在线视频| 久久久国产视频91| 欧美高清videos高潮hd| 亚洲国产精品视频在线观看| 韩国精品美女www爽爽爽视频| 国产欧美精品一区二区三区介绍| 欧美性20hd另类| 国产精品视频久久| 国产91av在线| 国产精品www| 国产亚洲美女久久| 久久影院在线观看| 久久综合九色九九| 国产精品一区久久| 国产精品com| 日韩中文字幕第一页| 国产成人精品久久二区二区91| 久久影视三级福利片| 国产精品视频一区国模私拍| 欧美中文字幕在线观看| 国产亚洲欧洲在线| 久久久久国产精品一区| 日韩亚洲精品电影| 亚洲色图第一页| 色综合久久久久久中文网| 久久精品欧美视频| 欧美成人激情在线| 国产精品入口免费视频一| 91在线观看免费高清完整版在线观看| 日韩av在线看| 国产精品久久久久久久久久尿| 久久亚洲精品小早川怜子66| 欧美xxxx做受欧美.88| 久久久久北条麻妃免费看| 91精品国产91久久久久| 国产精品亚洲精品| 亚洲欧美日韩图片| 日韩电影中文字幕一区| 久热精品视频在线观看一区| 久久国产一区二区三区| 国产欧亚日韩视频| 国内精品国产三级国产在线专| 欧美性猛交丰臀xxxxx网站| 久久久女人电视剧免费播放下载| 日韩在线观看免费av| 国产成人一区二区三区电影| 国产精品美女在线观看| 日韩综合视频在线观看| 欧美日韩在线免费观看| 精品国产依人香蕉在线精品| 色老头一区二区三区| 97久久精品人人澡人人爽缅北| 激情成人在线视频| 国产精品视频久| 欧美一区二粉嫩精品国产一线天| 国产69精品久久久| 亚洲国产精品悠悠久久琪琪| 日本精品视频在线播放| 尤物九九久久国产精品的分类| 一区二区在线免费视频| 精品久久久av| 亚洲欧美中文另类| 日韩欧美主播在线| 亚洲美女在线看| 欧美一区深夜视频| 欧美亚洲国产日韩2020| 国产ts一区二区| 2019中文字幕在线观看| 国产欧美精品在线| 亚洲精品久久久久|