查看:2641|回复:0
Lucene 3.6 实现中文分词发表时间:2013-01-10 15:59:27

我爱java

0分享0主题0帖子

学徒一级

(初出茅庐)

从Oracle数据库中取数据创建索引(使用IK分词)
001    package lucene.util;
002    
003    import org.apache.lucene.index.IndexWriter;
004    import org.apache.lucene.index.IndexWriterConfig;
005    import org.apache.lucene.index.CorruptIndexException;
006    import org.apache.lucene.store.FSDirectory;
007    import org.apache.lucene.store.Directory;
008    import org.apache.lucene.analysis.Analyzer;
009    import org.apache.lucene.analysis.standard.StandardAnalyzer;
010    import org.apache.lucene.util.Version;
011    import org.apache.lucene.document.Document;
012    import org.apache.lucene.document.Field;
013    import org.wltea.analyzer.lucene.IKAnalyzer;
014    
015    import java.sql.Connection;
016    import java.io.File;
017    import java.io.IOException;
018    import java.util.ArrayList;
019    import java.util.Date;
020    
021    import modules.gk.Gk_info;
022    import modules.gk.Gk_infoSub;
023    import web.sys.Globals;
024    import web.db.DBConnector;
025    import web.db.ObjectCtl;
026    import web.util.StringUtil;
027    //Wizzer.cn
028    public class LuceneIndex {
029        IndexWriter writer = null;
030        FSDirectory dir = null;
031        boolean create = true;
032    
033        public void init() {
034            long a1 = System.currentTimeMillis();
035            System.out.println("[Lucene 开始执行:" + new Date() + "]");
036            Connection con = DBConnector.getconecttion(); //取得一个数据库连接
037            try {
038                final File docDir = new File(Globals.SYS_COM_CONFIG.get("sys.index.path").toString());//E:\lucene
039                if (!docDir.exists()) {
040                    docDir.mkdirs();
041                }
042                String cr = Globals.SYS_COM_CONFIG.get("sys.index.create").toString();//true or false
043                if ("false".equals(cr.toLowerCase())) {
044                    create = false;
045                }
046                Directory dir = FSDirectory.open(docDir);
047    //            Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
048                Analyzer analyzer = new IKAnalyzer(true);
049                IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36, analyzer);
050                if (create) {
051                    // Create a new index in the directory, removing any
052                    // previously indexed documents:
053                    iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
054                } else {
055                    // Add new documents to an existing index:
056                    iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
057                }
058                IndexWriter writer = new IndexWriter(dir, iwc);
059                String sql = "SELECT indexno,title,describes,pdate,keywords FROM TABLEA WHERE STATE=1 AND SSTAG<>1 ";
060                int rowCount = ObjectCtl.getRowCount(con, sql);
061                int pageSize = StringUtil.StringToInt(Globals.SYS_COM_CONFIG.get("sys.index.size").toString());   //每页记录数
062                int pages = (rowCount - 1) / pageSize + 1; //计算总页数
063                ArrayList list = null;
064                Gk_infoSub gk = null;
065                for (int i = 1; i < pages+1; i++) {
066                    long a = System.currentTimeMillis();
067                    list = ObjectCtl.listPage(con, sql, i, pageSize, new Gk_infoSub());
068                    for (int j = 0; j < list.size(); j++) {
069                        gk = (Gk_infoSub) list.get(j);
070                        Document doc = new Document();
071                        doc.add(new Field("indexno", StringUtil.null2String(gk.getIndexno()), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));//主键不分词
072                        doc.add(new Field("title", StringUtil.null2String(gk.getTitle()), Field.Store.YES, Field.Index.ANALYZED));
073                        doc.add(new Field("describes", StringUtil.null2String(gk.getDescribes()), Field.Store.YES, Field.Index.ANALYZED));
074                        doc.add(new Field("pdate", StringUtil.null2String(gk.getPdate()), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));//日期不分词
075                        doc.add(new Field("keywords", StringUtil.null2String(gk.getKeywords()), Field.Store.YES, Field.Index.ANALYZED));
076                        writer.addDocument(doc);
077                        ObjectCtl.executeUpdateBySql(con,"UPDATE TABLEA SET SSTAG=1 WHERE indexno='"+gk.getIndexno()+"'");//更新已索引状态
078                    }
079    
080                    long b = System.currentTimeMillis();
081                    long c = b - a;
082                    System.out.println("[Lucene " + rowCount + "条," + pages + "页,第" + i + "页花费时间:" + c + "毫秒]");
083                }
084                writer.commit();
085    
086            } catch (Exception e) {
087                e.printStackTrace();
088            } finally {
089                DBConnector.freecon(con); //释放数据库连接
090                try {
091                    if (writer != null) {
092                        writer.close();
093                    }
094                } catch (CorruptIndexException e) {
095                    e.printStackTrace();
096                } catch (IOException e) {
097                    e.printStackTrace();
098                } finally {
099                    try {
100                        if (dir != null && IndexWriter.isLocked(dir)) {
101                            IndexWriter.unlock(dir);//注意解锁
102                        }
103                    } catch (IOException e) {
104                        e.printStackTrace();
105                    }
106                }
107            }
108            long b1 = System.currentTimeMillis();
109            long c1 = b1 - a1;
110            System.out.println("[Lucene 执行完毕,花费时间:" + c1 + "毫秒,完成时间:" + new Date() + "]");
111        }
112    }

您需要登录以后才可以回帖    登录|注册