lucene java 庖丁解牛_Lucene整合"庖丁解牛"中文分詞 ----入門 2

package cn.luanmad.lucene;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.TermPositionVector;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.TokenGroup;
import org.apache.lucene.search.highlight.TokenSources;
import org.apache.lucene.store.LockObtainFailedException;
import java.io.IOException;
import java.io.StringReader;
import java.net.URLDecoder;
import java.net.URLEncoder;
//測試"庖丁解牛"中文分詞器的分詞效果
public class Test
{
public String myLucene(String myInputString) throws Exception, IOException
{
String IDNEX_PATH = "E:/paoding_test_index";
// 獲取Paoding中文分詞器
//二元分詞
Analyzer analyzer = new PaodingAnalyzer();
//一元分詞
//Analyzer analyzer = new StandardAnalyzer();
String indexString = "luanmad!亂碼D七彩天空,經典文章無處不在!"+
"架構篇:千萬級的注冊用戶,千萬級的帖子,nTB級的附件,還有巨大的日訪問量,大型網站采用什么系統架構保證性能和穩定性?"+
"首先討論一下大型網站需要注意和考慮的問題。數據庫海量數據處理:負載量不大的情況下select、delete和update是響應很迅速的,最多加幾個索引就可以搞定,但千萬級的注冊用戶和一個設計不好的多對多關系將帶來非常嚴重的性能問題。另外在高UPDATE的情況下,更新一個聚焦索引的時間基本上是不可忍受的。索引和更新是一對天生的冤家。"+
"高並發死鎖:平時我們感覺不到,但數據庫死鎖在高並發的情況下的出現的概率是非常高的。文件存儲的問題:大型網站有海量圖片數據、視頻數據、文件數據等等,他們如何存儲並被有效索引?高並發的情況下IO的瓶頸問題會迅速顯現。也許用RAID和專用存貯服務器能解決眼下的問題,但是還有個問題就是各地的訪問問題,也許我們的服務器在北京,可能在雲南或者***的訪問速度如何解決?如果做分布式,那么我們的文件索引以及架構該如何規划。"+
"接下來討論大型網站的底層系統架構,來有效的解決上述問題。";
myInputString = (new String(myInputString.getBytes("iso8859-1"),"utf-8"));
StringReader reader1 = new StringReader(myInputString);
TokenStream ts = analyzer.tokenStream(myInputString, reader1);
String myString = "";
Token t = ts.next();
while (t != null)
{
myString += t.termText() + " ";
t = ts.next();
}
System.out.print("分詞結果:"+myString);
if("".equalsIgnoreCase(myString) || null == myString)
{
System.out.println("無匹配值!");
return "無匹配值!" ;
}
// 建立索引
IndexWriter writer = new IndexWriter(IDNEX_PATH, analyzer, true);
Document doc = new Document();
Field field = new Field("content", indexString,Field.Store.YES,
Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS);
doc.add(field);
writer.addDocument(doc);
writer.close();
System.out.println("Indexed success!");
// 檢索
IndexReader reader = IndexReader.open(IDNEX_PATH);
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse(myString);
Searcher searcher = new IndexSearcher(reader);
Hits hits = searcher.search(query);
if (hits.length() == 0)
{
System.out.println("hits.length=0");
return "無匹配值!";
}
Document doc2 = hits.doc(0);
// 高亮處理
String text = doc2.get("content");
TermPositionVector tpv = (TermPositionVector) reader.getTermFreqVector(
0, "content");
TokenStream ts1 = TokenSources.getTokenStream(tpv);
Formatter formatter = new Formatter()
{
public String highlightTerm(String srcText, TokenGroup g)
{
if (g.getTotalScore() <= 0)
{
return srcText;
}
return "" + srcText + "";
}
};
Highlighter highlighter = new Highlighter(formatter, new QueryScorer(
query));
String result = highlighter.getBestFragments(ts1, text, 5, "…");
System.out.println("result:nt" + result);
reader.close();
return result;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值