文档章节

java+lucene中文分词,百度搜索原理解析,十分重要的东西

赤尔宝丁
 赤尔宝丁
发布于 2016/05/17 09:26
字数 3150
阅读 119
收藏 8
点赞 2
评论 3

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

© 著作权归作者所有

共有 人打赏支持
赤尔宝丁
粉丝 6
博文 18
码字总数 20234
作品 0
成都
加载中

评论(3)

赤尔宝丁
赤尔宝丁

引用来自“风中蜡烛”的评论

可以用solr或elasticsearch实现。
可以用solr或elasticsearch实现也是基于java的?
风中蜡烛
风中蜡烛
可以用solr或elasticsearch实现。
赤尔宝丁
赤尔宝丁
顶起
java+lucene中文分词,来看看百度究竟是怎么找到你想要的(十分重要,楼主幸苦之作)

我想只要是学过数据库的孩纸,不管是mysql,还是sqlsever,一提到查找,本能的想到的便是like关键字,其实去转盘网(分类模式)之前也是采用这种算法,但我可以告诉大家一个很不幸的事情,l...

haoning747 ⋅ 2016/05/17 ⋅ 0

构建垂直搜索引擎

##定义与原理   搜索引擎( Search Engine)是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用...

fymoon ⋅ 2016/11/10 ⋅ 0

构建垂直搜索引擎

##定义与原理   搜索引擎( Search Engine)是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用...

fymoon ⋅ 2016/11/30 ⋅ 0

搜索引擎关键技术:中文分词技术介绍

信息的飞速增长,使搜索引擎成为人们查找信息的首选工具,Google、百度等大型搜索引擎一直是人们讨论的话题。随着搜索市场价值的不断增加,越来越多的公司开发出自己的搜索引擎,阿里巴巴的商...

脚本编程网站 ⋅ 2013/06/12 ⋅ 0

lucenc代码阅读指南、测试范例

Lucene 原理与代码分析完整版 -- 力荐 Lucene介绍及源码剖析: http://javenstudio.org/blog/annotated-lucene -- 核心IndexWriter 下载:Annotated+Lucene+.pdf: http://ishare.iask.sina.......

技术小美 ⋅ 2017/11/05 ⋅ 0

Whoosh 原理与实战1--Python 搜索框架 Whoosh 简介

Whoosh 是一个纯 Python 编写的搜索框架,类似于Lucene。比较简单,可以快速构建站内搜索。也可以在此基础上构建搜索引擎,但需要自己扩展 爬虫Spider 和 中文分词组件。 Whoosh详细可以查看...

从前 ⋅ 2012/11/12 ⋅ 2

python爬虫(一)_爬虫原理和数据抓取

本篇将开始介绍Python原理,更多内容请参考:Python学习指南 为什么要做爬虫 著名的革命家、思想家、政治家、战略家、社会改革的主要领导人物马云曾经在2015年提到由IT转到DT,何谓DT,DT即数...

小七奇奇 ⋅ 2017/11/13 ⋅ 0

ubuntu DNS解决方案。

Ubuntu采用宽带上网(DSL),昨天发现打不开网页了,真是无语,所以就得解决 首先我的wine qq可以登上,firefox打不开网页,我采用ping命令,ping 127.0.0.1可以ping通,但是ping 百度发现说无...

东风冷雪 ⋅ 2017/12/01 ⋅ 0

基于 DHT 网络的磁力链接和BT种子的搜索引擎架构

上周开发了一个磁力链接和 BT 种子的搜索引擎 {Magnet & Torrent},本文简单介绍一下主要的系统功能和用到的技术。 系统包括几个独立的部分: 使用 Python 的 Scrapy 框架开发的网络爬虫,用...

justjavac ⋅ 2015/02/01 ⋅ 6

flash破解之doswf去壳

写一个关于doswf去壳的教程,内存提取方法。 目前国内比较流行的加密软件有:doswf,FlashSecure,Encrypt。目前这3款软件中doswf有加壳,其余没有加壳,doswf的加壳说是可以防止吸血鬼,其实不...

水水鱼 ⋅ 2014/03/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 24分钟前 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 26分钟前 ⋅ 0

Redux的一些手法记录

Redux Redux的基本概念见另一篇文。 这里记录一下Redux在项目中的实际操作的手法。 actions 首先定义action.js,actions的type,可以另起一个action-type.js文件。 action-type.js用来存...

LinearLaw ⋅ 27分钟前 ⋅ 0

android 手势检测(左右滑动、上下滑动)

GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等。 使用GestureDetector分三步: 1. 定义GestureDetector类 2. 初始化手势类,同时设置手势监听 3. 将touch事件交给gesture...

王先森oO ⋅ 41分钟前 ⋅ 0

java 方法的执行时间监控 设置超时(Future 接口)

java 方法的执行时间监控 设置超时(Future 接口) import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor......

青峰Jun19er ⋅ 45分钟前 ⋅ 0

一名开源小白的Apache成长自述

今天收到了来自Apache Vote我成为Serviceomb项目Committer的邮件,代表自己的贡献得到了充分的肯定;除了感谢团队的给力支持,我更希望将自己的成长经历——如何践行Apache Way的心得介绍给大...

微服务框架 ⋅ 48分钟前 ⋅ 0

vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴

1.vim 是 vi 的升级版 vim 是带有颜色显示的 mini安装的系统,一般都不带有vim [root@aminglinux-128 ~]# yum install -y vim-enhanced已加载插件:fastestmirror, langpacksLoading mir...

oschina130111 ⋅ 48分钟前 ⋅ 0

Deepin 操作系统四面楚歌

作为国内做的最好的 Linux 发行版,源自 Debian sid 的 Deepin 目前正面临重重困境,新版本不断延期,开发人员离职,bug 长期得不到修复,和 Debian/Ubuntu 的兼容性问题也面临越来越严重的挑...

六库科技 ⋅ 48分钟前 ⋅ 0

MyBatis之动态sql

我们需要知道的是,使用mybatis重点是对sql的灵活解析和处理。在原先的UserMappser.xml中,我们这样查询表中满足条件的记录 : 123 <select id="findUserList" parameterType="userQuery...

瑟青豆 ⋅ 49分钟前 ⋅ 0

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已...

开源中国众包平台 ⋅ 49分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部