`
luanmad_java
  • 浏览: 16515 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Lucene整合"庖丁解牛"中文分词 ----入门 2

阅读更多
Lucene整合"庖丁解牛"中文分词 ----入门 2
相关的lucene包请到:http://code.google.com/p/paoding/downloads/list 下载。
入门第一篇:Lucene整合"庖丁解牛"中文分词 ----入门 1
http://luanmad2009.s156.eatj.com/viewthread.jsp?tid=338&page=1


相关的 Lucene 中文引擎,庖丁解牛的辞典参数配置方法请看 入门第一篇。

目录结构图:
E:\ECLIPSE\LUCENETEST
│ .classpath
│ .mymetadata
│ .project

├─.myeclipse
├─src
│ │ paoding-dic-home.properties
│ │
│ └─cn
│ └─luanmad
│ └─lucene
│ Test.java

└─WebRoot
│ index.jsp

├─META-INF
│ MANIFEST.MF

└─WEB-INF
│ web.xml

├─classes
│ │ paoding-dic-home.properties
│ │
│ └─cn
│ └─luanmad
│ └─lucene
│ Test$1.class
│ Test.class

└─lib
commons-logging.jar
junit.jar
lucene-analyzers-2.2.0.jar
lucene-core-2.2.0.jar
lucene-highlighter-2.2.0.jar
paoding-analysis.jar



Test.java


代码:
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 "<b><font color=red>" + srcText + "</font></b>";

}

};

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;
}
}

index.jsp


代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="cn.luanmad.lucene.Test" %>
<%@ page import="java.net.URLEncoder" %>
<jsp:directive.page import="java.net.URLDecoder;"/>

<html>
<head>


<title>luanmad!乱码D七彩天空</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="luanmad!,乱码D,lucene庖丁解牛中文分词">
<meta http-equiv="description" content="luanmad!,乱码D,lucene庖丁解牛中文分词">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

<script type="text/javascript">
function convers()
{
var myInputString = document.getElementById("myInputString").value;
myInputString = encodeURI(myInputString,"utf-8");
myForm.submit();
}
</script>
</head>

<body>
<center>
<h1><font color=red>luanmad!Search</font></h1>
<h4><font color=blue>乱码D七彩天空</font></h4>

<form action="index.jsp" name="myForm">

<input type="text" name="myInputString" id="myInputString" >
<input type="button" name="mySearching" value="Go" onclick = "convers()">



结果:

<%
String myInputString = request.getParameter("myInputString");

if(null == myInputString)
{
myInputString = "luanmad!";
}

Test test = new Test();
out.println(test.myLucene(myInputString));


%>
</form>
<hr></hr>
原文:

<td>
luanmad!乱码D七彩天空,经典文章无处不在!架构篇:
千万级的注册用户,千万级的帖子,nTB级的附件,还有巨大的日访问量,大型网站采用什么系统架构保证性能和稳定性?
首先讨论一下大型网站需要注意和考虑的问题。数据库海量数据处理:负载量不大的情况下select、delete和update是响应很迅速的,最多加几个索引就可以搞定,但千万级的注册用户和一个设计不好的多对多关系将带来非常严重的性能问题。另外在高UPDATE的情况下,更新一个聚焦索引的时间基本上是不可忍受的。索引和更新是一对天生的冤家。
高并发死锁:平时我们感觉不到,但数据库死锁在高并发的情况下的出现的概率是非常高的。文件存储的问题:大型网站有海量图片数据、视频数据、文件数据等等,他们如何存储并被有效索引?高并发的情况下IO的瓶颈问题会迅速显现。也许用RAID和专用存贮服务器能解决眼下的问题,但是还有个问题就是各地的访问问题,也许我们的服务器在北京,可能在云南或者***的访问速度如何解决?如果做分布式,那么我们的文件索引以及架构该如何规划。
接下来讨论大型网站的底层系统架构,来有效的解决上述问题。
<td>
</center>
</body>
</html>

本实例是采用了二元分词来搜索的,二元分词对于单个字是搜索不到的,除非辞典里有。如果想体验一元搜索,只需要把Test.java 中
//二元分词
//Analyzer analyzer = new PaodingAnalyzer();
//一元分词
Analyzer analyzer = new StandardAnalyzer();
切换就行。
附件

可到google一下   luanmad    乱码D
或直接到 http://luanmad2009.s156.eatj.com/viewthread.jsp?tid=339&page=1  下载

  • 大小: 167.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics