设为首页 收藏本站
查看: 890|回复: 0

[经验分享] 【手把手教你全文检索】Apache Lucene初探

[复制链接]

尚未签到

发表于 2018-11-19 08:23:05 | 显示全部楼层 |阅读模式
package test;  

  
import java.io.BufferedReader;
  
import java.io.File;
  
import java.io.FileInputStream;
  
import java.io.FileReader;
  
import java.util.ArrayList;
  
import java.util.Date;
  
import java.util.List;
  

  
import jxl.Cell;
  
import jxl.Sheet;
  
import jxl.Workbook;
  

  
import org.apache.lucene.analysis.Analyzer;
  
import org.apache.lucene.analysis.standard.StandardAnalyzer;
  
import org.apache.lucene.document.Document;
  
import org.apache.lucene.document.LongField;
  
import org.apache.lucene.document.TextField;
  
import org.apache.lucene.document.Field.Store;
  
import org.apache.lucene.index.DirectoryReader;
  
import org.apache.lucene.index.IndexWriter;
  
import org.apache.lucene.index.IndexWriterConfig;
  
import org.apache.lucene.queryparser.classic.QueryParser;
  
import org.apache.lucene.search.IndexSearcher;
  
import org.apache.lucene.search.Query;
  
import org.apache.lucene.search.ScoreDoc;
  
import org.apache.lucene.store.Directory;
  
import org.apache.lucene.store.FSDirectory;
  
import org.apache.lucene.util.Version;
  
import org.apache.poi.hwpf.HWPFDocument;
  
import org.apache.poi.hwpf.usermodel.Range;
  

  
/**
  
* @author xinghl
  
*
  
*/
  
public class IndexManager{
  
    private static IndexManager indexManager;
  
    private static String content="";
  

  
    private static String INDEX_DIR = "D:\\luceneIndex";
  
    private static String DATA_DIR = "D:\\luceneData";
  
    private static Analyzer analyzer = null;
  
    private static Directory directory = null;
  
    private static IndexWriter indexWriter = null;
  

  
    /**
  
     * 创建索引管理器
  
     * @return 返回索引管理器对象
  
     */
  
    public IndexManager getManager(){
  
        if(indexManager == null){
  
            this.indexManager = new IndexManager();
  
        }
  
        return indexManager;
  
    }
  
    /**
  
     * 创建当前文件目录的索引
  
     * @param path 当前文件目录
  
     * @return 是否成功
  
     */
  
    public static boolean createIndex(String path){
  
        Date date1 = new Date();
  
        List fileList = getFileList(path);
  
        for (File file : fileList) {
  
            content = "";
  
            //获取文件后缀
  
            String type = file.getName().substring(file.getName().lastIndexOf(".")+1);
  
            if("txt".equalsIgnoreCase(type)){
  

  
                content += txt2String(file);
  

  
            }else if("doc".equalsIgnoreCase(type)){
  

  
                content += doc2String(file);
  

  
            }else if("xls".equalsIgnoreCase(type)){
  

  
                content += xls2String(file);
  

  
            }
  

  
            System.out.println("name :"+file.getName());
  
            System.out.println("path :"+file.getPath());
  
//            System.out.println("content :"+content);
  
            System.out.println();
  

  

  
            try{
  
                analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);
  
                directory = FSDirectory.open(new File(INDEX_DIR));
  

  
                File indexFile = new File(INDEX_DIR);
  
                if (!indexFile.exists()) {
  
                    indexFile.mkdirs();
  
                }
  
                IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
  
                indexWriter = new IndexWriter(directory, config);
  

  
                Document document = new Document();
  
                document.add(new TextField("filename", file.getName(), Store.YES));
  
                document.add(new TextField("content", content, Store.YES));
  
                document.add(new TextField("path", file.getPath(), Store.YES));
  
                indexWriter.addDocument(document);
  
                indexWriter.commit();
  
                closeWriter();
  

  

  
            }catch(Exception e){
  
                e.printStackTrace();
  
            }
  
            content = "";
  
        }
  
        Date date2 = new Date();
  
        System.out.println("创建索引-----耗时:" + (date2.getTime() - date1.getTime()) + "ms\n");
  
        return true;
  
    }
  

  
    /**
  
     * 读取txt文件的内容
  
     * @param file 想要读取的文件对象
  
     * @return 返回文件内容
  
     */
  
    public static String txt2String(File file){
  
        String result = "";
  
        try{
  
            BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
  
            String s = null;
  
            while((s = br.readLine())!=null){//使用readLine方法,一次读一行
  
                result = result + "\n" +s;
  
            }
  
            br.close();
  
        }catch(Exception e){
  
            e.printStackTrace();
  
        }
  
        return result;
  
    }
  

  
    /**
  
     * 读取doc文件内容
  
     * @param file 想要读取的文件对象
  
     * @return 返回文件内容
  
     */
  
    public static String doc2String(File file){
  
        String result = "";
  
        try{
  
            FileInputStream fis = new FileInputStream(file);
  
            HWPFDocument doc = new HWPFDocument(fis);
  
            Range rang = doc.getRange();
  
            result += rang.text();
  
            fis.close();
  
        }catch(Exception e){
  
            e.printStackTrace();
  
        }
  
        return result;
  
    }
  

  
    /**
  
     * 读取xls文件内容
  
     * @param file 想要读取的文件对象
  
     * @return 返回文件内容
  
     */
  
    public static String xls2String(File file){
  
        String result = "";
  
        try{
  
            FileInputStream fis = new FileInputStream(file);
  
            StringBuilder sb = new StringBuilder();
  
            jxl.Workbook rwb = Workbook.getWorkbook(fis);
  
            Sheet[] sheet = rwb.getSheets();
  
            for (int i = 0; i < sheet.length; i++) {
  
                Sheet rs = rwb.getSheet(i);
  
                for (int j = 0; j < rs.getRows(); j++) {
  
                   Cell[] cells = rs.getRow(j);
  
                   for(int k=0;k 0) {
  
            return true;
  
        }else if (fileName.lastIndexOf(".xls") > 0) {
  
            return true;
  
        }else if (fileName.lastIndexOf(".doc") > 0) {
  
            return true;
  
        }
  
        return false;
  
    }
  

  
    public static void closeWriter() throws Exception {
  
        if (indexWriter != null) {
  
            indexWriter.close();
  
        }
  
    }
  
    /**
  
     * 删除文件目录下的所有文件
  
     * @param file 要删除的文件目录
  
     * @return 如果成功,返回true.
  
     */
  
    public static boolean deleteDir(File file){
  
        if(file.isDirectory()){
  
            File[] files = file.listFiles();
  
            for(int i=0; i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-636776-1-1.html 上篇帖子: 三.apache 网页重写 squid 下篇帖子: Centos7+Lvs+keeplived实现Apache高可用的负载均衡
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表