我想只要是学过数据库的孩纸,不管是mysql,还是sqlsever,一提到查找,本能的想到的便是like关键字,其实去转盘网分类模式)之前也是采用这种算法,但我可以告诉大家一个很不幸的事情,like匹配其实会浪费大量的有用资源,原因这里不说了请自己想一想,我们还是直接摆事实验证。

现在用去转盘网搜:hello 找个单词,如下:

http://www.quzhuanpan.com/source/search.action?q=hello&currentPage=1

翻页你会发现只要是包含hello的单词都找到了,但是如果你用like的话是不会有这个效果的,不信让我们再看一下,还好他来说电影网的分词算法我还没来得及修改,还可以看到现象:

http://www.talaishuo.com/searchResult.do?searchFileName=hello

你会发现只有开始包含hello这个字段的搜索串才能得到匹配,这就问题来了,数据库中大量的资源岂不是白白浪费了,不过没事,伟大的人类还是很聪明的,发明了分词,分词的原理我就不讲了,请自己百度吧,还是直接上代码,提示,这里需要四个jar包作为工具,我先上传的去转盘,想要做分词的请先下载:

分词包下载地址1

分词包下载地址2

直接看代码:

package com.tray.indexData;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.highlight.Highlighter;
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.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer; import com.tray.bean.SerachResult;
import com.tray.common.tools.DateFormater; public class LuceneSearch { private static String DISC_URL = "/home/indexData/data"; static {
String os = System.getProperty("os.name");
if(os.toLowerCase().startsWith("win")){
DISC_URL = "E:\\indexData\\data";
}
else{
DISC_URL ="/home/indexData/data";
}
} //指定分词器
private Analyzer analyzer=new IKAnalyzer();
private static Directory directory;
//配置
private static IndexWriterConfig iwConfig;
//配置IndexWriter
private static IndexWriter writer;
private static File indexFile = null; private static Version version = Version.LUCENE_36; private final int PAPGESIZE=10; /**
* 全量索引
* @Author haoning
*/
public void init() throws Exception { try {
indexFile = new File(DISC_URL);
if (!indexFile.exists()) {
indexFile.mkdir();
}
directory=FSDirectory.open(indexFile);
//配置IndexWriterConfig
iwConfig = new IndexWriterConfig(version,analyzer);
iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
//创建写索引对象
writer = new IndexWriter(directory,iwConfig);
} catch (Exception e) {
}
} public void closeWriter(){
try {
writer.close();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} public void commit(){ try {
writer.commit();
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 一个一个索引
* @Author haoning
*/
public void singleIndex(Document doc) throws Exception {
writer.addDocument(doc);
} /**
* 一个跟新
* @Author haoning
*/
public void singleUpdate(Document doc) throws Exception {
Term term = new Term("url", doc.get("url"));
writer.updateDocument(term,doc);
} /**
* 全量索引
* @Author haoning
*/
public void fullIndex(Document[] documentes) throws Exception { writer.deleteAll();
for (Document document : documentes) {
writer.addDocument(document);
}
writer.commit();
} /**
* 根据id删除索引
* @Author haoning
*/
public void deleteIndex(Document document)throws Exception{
Term term = new Term("url", document.get("url"));//url才是唯一标志
writer.deleteDocuments(term);
writer.commit();
} /**
* 根据id增量索引
* @Author haoning
*/
public void updateIndex(Document[] documentes) throws Exception{
for (Document document : documentes) {
Term term = new Term("url", document.get("url"));
writer.updateDocument(term, document);
}
writer.commit();
} /**
* 直接查询
* @Author haoning
*/
public void simpleSearch(String filedStr,String queryStr,int page, int pageSize) throws Exception{
File indexDir = new File(DISC_URL);
//索引目录
Directory dir=FSDirectory.open(indexDir);
//根据索引目录创建读索引对象
IndexReader reader = IndexReader.open(dir);
//搜索对象创建
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector topCollector = TopScoreDocCollector.create(searcher.maxDoc(), false); Term term = new Term(filedStr, queryStr);
Query query = new TermQuery(term);
searcher.search(query, topCollector);
ScoreDoc[] docs = topCollector.topDocs((page-1)*pageSize, pageSize).scoreDocs; printScoreDoc(docs, searcher);
} /**
* 高亮查询
* @Author haoning
*/
public Map<String, Object> highLightSearch(String filed,String keyWord,int curpage, int pageSize) throws Exception{
List<SerachResult> list=new ArrayList<SerachResult>();
Map<String,Object> map = new HashMap<String,Object>();
if (curpage <= 0) {
curpage = 1;
}
if (pageSize <= 0 || pageSize>20) {
pageSize = PAPGESIZE;
}
File indexDir = new File(DISC_URL); //索引目录
Directory dir=FSDirectory.open(indexDir);//根据索引目录创建读索引对象
IndexReader reader = IndexReader.open(dir);//搜索对象创建
IndexSearcher searcher = new IndexSearcher(reader); int start = (curpage - 1) * pageSize; Analyzer analyzer = new IKAnalyzer(true);
QueryParser queryParser = new QueryParser(Version.LUCENE_36, filed, analyzer);
queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
Query query = queryParser.parse(keyWord); int hm = start + pageSize;
TopScoreDocCollector res = TopScoreDocCollector.create(hm, false);
searcher.search(query, res); SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");
Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query)); long amount = res.getTotalHits();
//long pages = (rowCount - 1) / pageSize + 1; //计算总页数 map.put("amount",amount);//总共多少条记录 TopDocs tds = res.topDocs(start, pageSize);
ScoreDoc[] sd = tds.scoreDocs; for (int i = 0; i < sd.length; i++) {
Document doc = searcher.doc(sd[i].doc);
String temp=doc.get("name");
//做高亮处理
TokenStream ts = analyzer.tokenStream("name", new StringReader(temp)); SerachResult record=new SerachResult();
String name = highlighter.getBestFragment(ts,temp);
String skydirverName=doc.get("skydirverName");
String username=doc.get("username");
String shareTime=doc.get("shareTime");
String describ=doc.get("describ");
String typeId=doc.get("typeId");
String id=doc.get("id");
String url=doc.get("url"); record.setName(name);
record.setSkydriverName(skydirverName);
record.setUsername(username);
record.setShareTime(DateFormater.getFormatDate(shareTime,"yyyy-MM-dd HH:mm:ss"));
record.setDescrib(describ);
record.setTypeId(Integer.parseInt(typeId));
record.setId(new BigInteger(id));
record.setUrl(url);
list.add(record); /*System.out.println("name:"+name);
System.out.println("skydirverName:"+skydirverName);
System.out.println("username:"+username);
System.out.println("shareTime:"+shareTime);
System.out.println("describ:"+describ);
System.out.println("typeId:"+typeId);
System.out.println("id:"+id);
System.out.println("url:"+url);*/
}
map.put("source",list);
return map;
} /**
* 根据前缀查询
* @Author haoning
*/
public void prefixSearch(String filedStr,String queryStr) throws Exception{
File indexDir = new File(DISC_URL);
//索引目录
Directory dir=FSDirectory.open(indexDir);
//根据索引目录创建读索引对象
IndexReader reader = IndexReader.open(dir);
//搜索对象创建
IndexSearcher searcher = new IndexSearcher(reader); Term term = new Term(filedStr, queryStr);
Query query = new PrefixQuery(term); ScoreDoc[] docs = searcher.search(query, 3).scoreDocs;
printScoreDoc(docs, searcher);
} /**
* 通配符查询
* @Author haoning
*/
public void wildcardSearch(String filedStr,String queryStr) throws Exception{
File indexDir = new File(DISC_URL);
//索引目录
Directory dir=FSDirectory.open(indexDir);
//根据索引目录创建读索引对象
IndexReader reader = IndexReader.open(dir);
//搜索对象创建
IndexSearcher searcher = new IndexSearcher(reader); Term term = new Term(filedStr, queryStr);
Query query = new WildcardQuery(term);
ScoreDoc[] docs = searcher.search(query, 3).scoreDocs;
printScoreDoc(docs, searcher);
} /**
* 分词查询
* @Author haoning
*/
public void analyzerSearch(String filedStr,String queryStr) throws Exception{
File indexDir = new File(DISC_URL);
//索引目录
Directory dir=FSDirectory.open(indexDir);
//根据索引目录创建读索引对象
IndexReader reader = IndexReader.open(dir);
//搜索对象创建
IndexSearcher searcher = new IndexSearcher(reader); QueryParser queryParser = new QueryParser(version, filedStr, analyzer);
Query query = queryParser.parse(queryStr); ScoreDoc[] docs = searcher.search(query, 3).scoreDocs;
printScoreDoc(docs, searcher);
} /**
* 多属性分词查询
* @Author haoning
*/
public void multiAnalyzerSearch(String[] filedStr,String queryStr) throws Exception{
File indexDir = new File(DISC_URL);
//索引目录
Directory dir=FSDirectory.open(indexDir);
//根据索引目录创建读索引对象
IndexReader reader = IndexReader.open(dir);
//搜索对象创建
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser queryParser = new MultiFieldQueryParser(version, filedStr, analyzer);
Query query = queryParser.parse(queryStr); ScoreDoc[] docs = searcher.search(query, 3).scoreDocs;
printScoreDoc(docs, searcher);
} public void printScoreDoc(ScoreDoc[] docs,IndexSearcher searcher)throws Exception{
for (int i = 0; i < docs.length; i++) {
List<Fieldable> list = searcher.doc(docs[i].doc).getFields();
for (Fieldable fieldable : list) {
String fieldName = fieldable.name();
String fieldValue = fieldable.stringValue();
System.out.println(fieldName+" : "+fieldValue);
}
}
}
}

  

注意由于去转盘网(http://www.quzhuanpan.com)是部署到linux上的,所以DISC_URL可以更具系统变换,我是通过url来判定索引文件是否唯一的,你可以更具id来判断,具体情况具体对待吧。
package com.tray.indexData;

import java.sql.SQLException;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.Statement; public class IndexFile { private static Connection conn = null;
private static Statement stmt = null;
private final int NUM=500000;
private LuceneSearch ls;
private long count=0; public ResultSet deal6SourceTable(String tableName) throws SQLException{
String sql = "SELECT distinct `NAME`,SKYDRIVER_NAME,USERNAME,SHARE_TIME,DESCRIB,TYPE_ID,ID,URL FROM "+tableName+" where STATUS=1 and TYPE_ID !='-1' and (TYPE_NAME is null or TYPE_NAME!=1) limit "+NUM;
//System.out.println(sql);
ResultSet rs = (ResultSet) stmt.executeQuery(sql);
return rs;
} public void update6SourceTable(String tableName) throws SQLException{
Statement st = (Statement) conn.createStatement();
String sql = "update "+tableName+" set TYPE_NAME=1 where STATUS=1 and TYPE_ID !='-1' and (TYPE_NAME is null or TYPE_NAME!=1) limit "+NUM;
//System.out.println("update"+sql);
try {
st.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
} public void indexInit(){//数据库+lcene初始化
conn = (Connection) JdbcUtil.getConnection();
if(conn == null) {
try {
throw new Exception("数据库连接失败!");
} catch (Exception e) {
e.printStackTrace();
}
}
ls=new LuceneSearch();
try {
ls.init();
} catch (Exception e2) {
e2.printStackTrace();
}
} public void indexEnd(){//数据库+lcene关闭 ls.closeWriter();
try {
conn.close();//关闭数据库
} catch (SQLException e) {
e.printStackTrace();
}
} public void Index6Data() throws SQLException{
try {
stmt = (Statement) conn.createStatement();
} catch (SQLException e1) {
e1.printStackTrace();
} ResultSet r1=null;
ResultSet r2=null;
ResultSet r3=null;
ResultSet r4=null;
ResultSet r5=null;
ResultSet r6=null; boolean stop=false;
do{
r1=deal6SourceTable("film_and_tv_info");
stop=this.createIndex(r1,ls,"1"); //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
if(!stop){
ls.commit();//加个判断条件
}
//System.out.println("stop"+stop); }while(!stop); stop=false;
do{
r2=deal6SourceTable("music_and_mv_info");
stop=this.createIndex(r2,ls,"2"); //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
if(!stop){
ls.commit();//加个判断条件
} }while(!stop); stop=false;
do{
r3=deal6SourceTable("e_book_info");
stop=this.createIndex(r3,ls,"3"); //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
if(!stop){
ls.commit();//加个判断条件
} }while(!stop); stop=false;
do{
r4=deal6SourceTable("bt_file_info");
stop=this.createIndex(r4,ls,"4"); //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
if(!stop){
ls.commit();//加个判断条件
} }while(!stop); stop=false;
do{
r5=deal6SourceTable("characteristic_software_info");
stop=this.createIndex(r5,ls,"5"); //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
if(!stop){
ls.commit();//加个判断条件
} }while(!stop); stop=false;
do{
r6=deal6SourceTable("source_code_info");
stop=this.createIndex(r6,ls,"6"); //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
if(!stop){
ls.commit();//加个判断条件
} }while(!stop);
stop=false; } public ResultSet deal2Share(String tableName) throws SQLException{
String sql = "SELECT distinct NAME,SKYDRIVER_NAME,USERNAME,SHARE_TIME,DESCRIB,TYPE_ID,ID,SHORTURL from "+tableName+" where STATUS=1 and FS_ID ='1' limit "+NUM; //利用FS_ID这个字段,没什么用处
ResultSet rs = (ResultSet) stmt.executeQuery(sql);
return rs;
} public ResultSet deal3Share(String tableName) throws SQLException{
String sql = "SELECT distinct title,channel,uid,ctime,description,port,id,shorturl from "+tableName+" where name ='1' limit "+NUM;
ResultSet rs = (ResultSet) stmt.executeQuery(sql);
return rs;
} public void Index3Data() throws SQLException{
try {
stmt = (Statement) conn.createStatement();
} catch (SQLException e1) {
e1.printStackTrace();
} ResultSet r1=null;
ResultSet r2=null;
ResultSet r3=null; boolean stop=false;
do{
r1=deal2Share("share1");
stop=this.createIndex(r1,ls,"7"); //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
if(!stop){
ls.commit();//加个判断条件
}
//System.out.println("stop"+stop); }while(!stop); stop=false;
do{
r2=deal2Share("share2");
stop=this.createIndex(r2,ls,"8"); //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
if(!stop){
ls.commit();//加个判断条件
} }while(!stop); stop=false;
do{
r3=deal3Share("share3");
stop=this.createIndex(r3,ls,"9"); //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
if(!stop){
ls.commit();//加个判断条件
} }while(!stop);
stop=false;
} public void update2ShareTable(String tableName) throws SQLException{
Statement st = (Statement) conn.createStatement();
String sql = "update "+tableName+" set FS_ID=0 where STATUS=1 and FS_ID ='1' limit "+NUM; //利用FS_ID这个字段,没什么用处
//System.out.println("update"+sql);
try {
st.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
} public void update3ShareTable(String tableName) throws SQLException{
Statement st = (Statement) conn.createStatement();
String sql = "update "+tableName+" set name=0 where name ='1' limit "+NUM;
//System.out.println("update"+sql);
try {
st.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
} public boolean createIndex(ResultSet rs,LuceneSearch ls,String mark) {
try {
String tableName=null;
if(mark.equals("1")){
tableName="film_and_tv_info";
}
if(mark.equals("2")){
tableName="music_and_mv_info";
}
if(mark.equals("3")){
tableName="e_book_info";
}
if(mark.equals("4")){
tableName="bt_file_info";
}
if(mark.equals("5")){
tableName="characteristic_software_info";
}
if(mark.equals("6")){
tableName="source_code_info";
}
if(mark.equals("7")){
tableName="share1";
}
if(mark.equals("8")){
tableName="share2";
}
if(mark.equals("9")){
tableName="share3";
} boolean isNull=rs.next();
//System.out.println("hehe"+isNull);
if(isNull==false){
return true;//处理完毕
}
while(isNull){
if(Integer.parseInt(mark)>=1&&Integer.parseInt(mark)<=8){
Document doc = new Document();
//System.out.println("name"+rs.getString("NAME"));
Field name = new Field("name",rs.getString("NAME"),Field.Store.YES,Field.Index.ANALYZED);
String skName=rs.getString("SKYDRIVER_NAME");
if(skName==null){
skName="百度";
}
Field skydirverName = new Field("skydirverName",skName, Field.Store.YES,Field.Index.NOT_ANALYZED);
Field username = new Field("username",rs.getString("USERNAME"),Field.Store.YES, Field.Index.ANALYZED);
Field shareTime = new Field("shareTime",rs.getString("SHARE_TIME"), Field.Store.YES,Field.Index.NOT_ANALYZED);
String desb=rs.getString("DESCRIB");
if(desb==null){
desb="-1";
}
Field describ = new Field("describ",desb,Field.Store.NO,Field.Index.NOT_ANALYZED);
Field typeId = new Field("typeId",rs.getString("TYPE_ID"), Field.Store.YES,Field.Index.NOT_ANALYZED);
Field id = new Field("id",rs.getString("ID"),Field.Store.YES,Field.Index.NOT_ANALYZED);
Field url =null;
if(Integer.parseInt(mark)>=7&&Integer.parseInt(mark)<=8){
url = new Field("url",rs.getString("SHORTURL"), Field.Store.YES,Field.Index.ANALYZED);
}
else{
url = new Field("url",rs.getString("URL"), Field.Store.YES,Field.Index.ANALYZED);
}
doc.add(name);
doc.add(skydirverName);
doc.add(username);
doc.add(shareTime);
doc.add(describ);
doc.add(typeId);
doc.add(id);
doc.add(url);
ls.singleUpdate(doc);//用跟新更为合适
isNull=rs.next();
}
else{
Document doc = new Document();
//System.out.println("title"+rs.getString("title"));
Field name = new Field("name",rs.getString("title"),Field.Store.YES,Field.Index.ANALYZED);
String skName=rs.getString("channel");
Field skydirverName = new Field("skydirverName",skName, Field.Store.YES,Field.Index.NOT_ANALYZED);
Field username = new Field("username",rs.getString("uid"),Field.Store.YES, Field.Index.ANALYZED);
Field shareTime = new Field("shareTime",rs.getString("ctime"), Field.Store.YES,Field.Index.NOT_ANALYZED);
String desb=rs.getString("description");
if(desb==null){
desb="-1";
}
Field describ = new Field("describ",desb,Field.Store.NO,Field.Index.NOT_ANALYZED);
Field typeId = new Field("typeId",rs.getString("port"), Field.Store.YES,Field.Index.NOT_ANALYZED);
Field id = new Field("id",rs.getString("id"),Field.Store.YES,Field.Index.NOT_ANALYZED);
Field url = new Field("url",rs.getString("shorturl"), Field.Store.YES,Field.Index.ANALYZED); doc.add(name);
doc.add(skydirverName);
doc.add(username);
doc.add(shareTime);
doc.add(describ);
doc.add(typeId);
doc.add(id);
doc.add(url);
ls.singleUpdate(doc);//用跟新更为合适
isNull=rs.next();
}
count=count+1;
}
if(Integer.parseInt(mark)>=1&&Integer.parseInt(mark)<=6){
update6SourceTable(tableName);//处理完成后做标志
}
else if(Integer.parseInt(mark)>=7&&Integer.parseInt(mark)<=8){
update2ShareTable(tableName);//处理完成后做标志
}
else{
update3ShareTable(tableName);//处理完成后做标志
}
System.out.println("Has index "+count+"条数据,数据来自表"+tableName); } catch (Exception e) {
e.printStackTrace();
}
return false;
}
}

  

数据库之类的请不要关心,看思路即可,你如果需要换成你的即可,这里就不多说了。

看最后的部分:

pack

age com.tray.indexData;

import java.sql.SQLException;

public class Application {

    public static void main(String[] args){
/*IndexFile indexFile=new IndexFile();
indexFile.indexInit();
try {
indexFile.Index6Data();
} catch (SQLException e1) {
e1.printStackTrace();
}
indexFile.indexEnd();*/ IndexFile indexFile1=new IndexFile();
indexFile1.indexInit();
try {
indexFile1.Index3Data();
} catch (SQLException e1) {
e1.printStackTrace();
}
indexFile1.indexEnd(); LuceneSearch lch=new LuceneSearch();
try {
long a = System.currentTimeMillis();
lch.highLightSearch("name", "flv", 1,3);
long b = System.currentTimeMillis();
long c = b - a;
System.out.println("[高级检索花费时间:" + c + "毫秒]");
} catch (Exception e) {
e.printStackTrace();
}
}
}

  

你可以在一个applicationic程序中开始索引,也可以写个定时器来定时索引,看需求。以上代码是楼主幸苦的作品,转载请不要改动,本人确保代码完全可用。

java+lucene中文分词,来看看百度究竟是怎么找到你想要的(十分重要,楼主幸苦之作)的更多相关文章

  1. 11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较

    本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...

  2. 推荐十款java开源中文分词组件

    1:Elasticsearch的开源中文分词器 IK Analysis(Star:2471) IK中文分词器在Elasticsearch上的使用.原生IK中文分词是从文件系统中读取词典,es-ik本身 ...

  3. 11大Java开源中文分词器的使用方法和分词效果对比

    本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...

  4. lucene中文分词——(四)

    1.分析器的执行过程:

  5. (五)Lucene——中文分词器

    1. 什么是中文分词器 对于英文,是安装空格.标点符号进行分词 对于中文,应该安装具体的词来分,中文分词就是将词,切分成一个个有意义的词. 比如:“我的中国人”,分词:我.的.中国.中国人.国人. 2 ...

  6. Java开源中文分词类库

      IKAnalyzer  IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本.最初,它是以开 ...

  7. Lucene开发实例:Lucene中文分词(转载)

    1.准备工作下载lucene 3.6.1 : http://lucene.apache.org/下载中文分词IK Analyzer: http://code.google.com/p/ik-analy ...

  8. java实现中文分词

    IK Analyzer是基于lucene实现的分词开源框架 下载路径:http://so.csdn.net/so/search/s.do?q=IKAnalyzer2012.jar&t=doc& ...

  9. java读取中文分词工具(一)

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...

随机推荐

  1. springMVC配置静态资源访问的<mvc:resources>标签的使用

    在springmvc中,为了引用资源的访问不会类似Controller一样被拦截,区分出关注的资源的访问,一般我们在springMVC里面的拦截都会配置为"/",拦截所有的.但是这 ...

  2. hdoj-1301-Jungle Roads【最小生成树】

    Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  3. 解决:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile

    在项目构建的时候遇到了这样的问题:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile(d ...

  4. VS 一键调用 SVN Blame

    在Windows上做项目开发的时候,常常需要调用SVN Blame去追溯一个文件的编辑历史,但是这个常见的需求往往需要很繁琐的步骤.首先需要打开文件所在文件夹,然后右键,在一长排上下文菜单中准确地选中 ...

  5. 算法笔记_113:算法集训之代码填空题集一(Java)

     目录 1 报数游戏 2 不连续处断开 3 猜数字游戏 4 串的反转 5 串中找数字 6 递归连续数 7 复制网站内容 8 股票的风险 9 基因牛的繁殖 10 括号的匹配   1 报数游戏 有n个孩子 ...

  6. 应用LR监控Apache性能

    1)对Apache服务器中的http.conf进行如下配置修改Apache中Httpd.conf文件,添加如下代码(该文件中都有,只要取消注释就好了)<Location /server-stat ...

  7. Markdown 语法背一下咯

    标题 使用`=`和`-`标记一级和二级标题.  # 一级标题 ## 二级标题 使用`#`,可表示1-6级标题.  # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标 ...

  8. iOS应用程序开发之应用间的跳转

    简介 配置和实现 判断应用启动方式 一.简介 最实际项目开发中,我们难免会遇到需要从一个应用跳转到另一个应用的情况.比如微信分享,实际就是一种应用间的跳转.但是有时候我们需要实现自己的两个应用间的跳转 ...

  9. 我眼中的PageRank算法详解

    随着互联网的发展,网络上已有的网页数量庞大,并且每天都会有很多网页发布,如何权衡这些重要度的排名是一个很重要的问题.我们今天就来了解一下PageRank算法. 首先我们要来了解一下图的概念,请看图1. ...

  10. swift向方法传数组参数的语法

    总是记不住向方法中传数组参数的语法,所以记录一下. func calculateStatistics(scores:[Int]) -> (min:Int,max:Int,sum:Int) { v ...