java中文分词算法

我想只要是学过数据库的孩纸,不管是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;
        }
}

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

package 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程序中开始索引,也可以写个定时器来定时索引,看需求。以上代码是楼主幸苦的作品,转载请不要改动,本人确保代码完全可用。

时间: 2024-10-10 06:19:09

java中文分词算法的相关文章

在Hadoop上运行基于RMM中文分词算法的MapReduce程序

原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词算法的MapReduce程序 23条回复 我知道这个文章标题很“学术”化,很俗,让人看起来是一篇很牛B或者很装逼的论文!其实不然,只是一份普通的实验报告,同时本文也不对RMM中文分词算法进行研究.这个实验报告是我做高性能计算课程的实验里提交的.所以,下面的内容是从我的实验报告里摘录出来的,当作是我学

Mmseg中文分词算法解析

@author linjiexing 开发中文搜索和中文词库语义自己主动识别的时候,我採用都是基于mmseg中文分词算法开发的Jcseg开源project.使用场景涉及搜索索引创建时的中文分词.新词发现的中文分词.语义词向量空间构建过程的中文分词和文章特征向量提取前的中文分词等,整体使用下来,感觉jcseg是一个非常优秀的开源中文分词工具,并且可配置和开源的情况下,能够满足非常多场景的中文分词逻辑.本文先把jcseg使用到最主要的mmseg算法解析一下. 1. 中文分词算法之争 在分析mmseg

NLP: 中文分词算法--正向最大匹配 Forward Maximum Matching

最近接触NLP中文分词, 在lunr.js的基础上, 实现了中文的最大正向匹配分词. 某些情况下, 我们在服务器端进行中文文本分词可以使用完整的基于mmseg算法的分词模块, 例如nodejieba, node-segment, 盘古分词等等,  但是在客户端环境下, 我们不能使用这些复杂的分词算法进行分词, 这个时候可以根据已经生成的索引进行简单的客户端分词, 就是所说的FMM (Forward Maximum Matching, 正向最大匹配), 有时候也可以使用正向匹配. 在做FMM的时候

NLP: 中文分词算法---交集歧义检测 (cross ambiguity detect)

在 文章 http://blog.csdn.net/watkinsong/article/details/37697451 里面提到的FM中文分词算法中, 最大的问题就是将用户的query切分的太碎, 切分太碎也会对检索结果造成一定的影响. 这里, 可以采用FMM算法进行切分, 首先切分出最大的正向匹配, 然后进行交集歧义检测, 如果检测到存在交集歧义, 那么对可能存在歧义的一段文字进行FM切分, 获取所有的可能切分结果: 然后对剩下的query子句重复进行FMM切分, 直到query == n

中文分词算法综述

英文文本词与词之间以空格分隔,方便计算机识别,但是中文以字为单位,句子所有字连起来才能表达一个完整的意思.如英文"I am writing a blog",英文词与词之间有空格进行隔开,而对应的中文"我在写博客",所有的词连在一起,计算机能很容易的识别"blog"是一个单词,而很难知道"博"."客"是一个词,因此对中文文本序列进行切分的过程称为"分词".中文分词算法是自然语言处理的基础,

机器学习基础——一文讲懂中文分词算法

在前文当中,我们介绍了搜索引擎的大致原理.有错过或者不熟悉的同学,可以点击下方的链接回顾一下前文的内容. ML基础--搜索引擎基本原理 在介绍爬虫部分的时候,我们知道,爬虫在爬取到网页的内容之后,会先进行一些处理.首先要做的就是过滤掉HTML当中的各种标签信息,只保留最原生的网页内容.之后,程序会对这些文本内容提取关键词. 今天我们就来讲讲关键词提取当中最重要的一个部分--中文分词. 在世界上众多的语言当中,中文算是比较特殊的一种.许多语言自带分词信息,比如英文,机器学习写作machine le

中文分词算法 之 基于词典的全切分算法

在使用 基于词典 的分词方法的时候,如果我们解决了下面4个问题: 1.如何把一句话中所有的词找出来呢?只要词典中有就一定要找出来. 2.如何利用1中找出来的词组合成完整的句子?组合成的句子要和原句一样. 3.如何保证2中组合而成的句子包含了所有可能的词序? 4.如何从所有可能的词序中选择最完美的一种作为最终的分词结果? 那么我们的分词方法称之为:基于词典的全切分算法. 下面我们以一个实例来说明,比如句子:中华人民共和国. 假设词典中包含如下词: 中华人民共和国 中华人民 中华 华人 人民共和国

【Java】Java中文分词器Ansj的使用

以前都是用C++对中文进行分词,也用过Python的"结巴"分词,最近用了一下Java的Ansj中文分词,感觉还不错. 下面是用Ansj对中文进行分词的一个简单例子,希望能对大家有用. 1.下载Ansj的相关jar包 要用Ansj进行中文分词,必须先下载Ansj的jar包,下载地址可以参考:https://github.com/NLPchina/ansj_seg 2.程序代码 用Ansj进行中文分词的简单代码如下所示: import org.ansj.splitWord.analysi

中文分词算法-百度面试题

题目: 给定一个字符串, 一个数组,判断这个字符串能否被分隔成字典里的一个个单词. 用动态规划算法 我面试时写的是下面的代码 public static boolean divied2(String s,String[] dict){ boolean result=false; if(s.length()==0) return true; for (int i = 0; i < dict.length; i++) { int index=s.indexOf(dict[i]); if (index