lucene学习-3 - 代码重构

内容就是标题了。是要重构下上一节的代码,大体上按如下的思路:

  • 功能拆分;
  • 创建必要的工具类;

两个工具类StringUtils和TxtUtils。

StringUtils,主要是获取当前系统的换行符:

package com.zhyea.util;

public class StringUtils {

    public static final String NEWLINE = System.getProperty("line.separator");

}

TxtUtils,主要是读取txt文件,这里使用了一个自定义类FileCharsetDetector,可以点击这个超链接

package com.zhyea.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * txt文件处理工具类
 *
 * @author robin
 *
 */
public class TxtUtils {

    /**
     * 检查txt文件编码格式
     *
     * @param file
     *            txt文件对象
     * @return
     * @throws IOException
     */
    public static String checkEncode(File file) throws IOException {
        String encode = FileCharsetDetector.checkEncoding(file);
        return (encode.equals("windows-1252") ? "Unicode" : encode);
    }

    /**
     * 读取txt文件内容
     *
     * @param file
     *            Txt文件对象
     * @return
     * @throws IOException
     */
    public static String readTxt(File file) throws IOException {
        BufferedReader reader = null;
        try {
            String encode = checkEncode(file);
            reader = new BufferedReader(new InputStreamReader(
                    new FileInputStream(file), encode));
            StringBuilder builder = new StringBuilder();
            String content = null;
            while (null != (content = reader.readLine())) {
                builder.append(content).append(StringUtils.NEWLINE);
            }
            return builder.toString();
        } finally {
            reader.close();
        }
    }

}

然后是拆分后的Lucene操作类:

package com.zhyea.doggie;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import com.zhyea.util.TxtUtils;

public class DoggieLucene {

    /**
     * 分词器
     */
    private static Analyzer analyzer;

    /**
     * 创建分词器实例
     *
     * @param clazz
     *            创建分词器使用的类
     * @return
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    public static Analyzer createAnalyzer(Class<?> clazz)
            throws InstantiationException, IllegalAccessException {
        if (null != analyzer && analyzer.getClass().equals(clazz)) {
            return analyzer;
        }
        return analyzer = (Analyzer) clazz.newInstance();
    }

    /**
     * 创建索引写出器
     *
     * @param analyzer
     *            分词器
     * @param indexPath
     *            索引存储路径
     * @return
     * @throws IOException
     */
    public static IndexWriter createIndexWriter(Analyzer analyzer,
            String indexPath) throws IOException {
        // 创建索引存储目录
        Directory dir = FSDirectory.open(new File(indexPath));
        // 创建索引写入器配置
        IndexWriterConfig config = new IndexWriterConfig(Version.LATEST,
                analyzer);
        // 创建索引写入器
        return new IndexWriter(dir, config);
    }

    /**
     * 写入索引,索引文件为本地文本文件
     *
     * @param writer
     *            索引写出器
     * @param localDocPath
     *            本地文本文件存储地址
     * @throws IOException
     */
    public static void addLocalDocument(IndexWriter writer, String localDocPath)
            throws IOException {
        File directory = new File(localDocPath);
        for (File tmp : directory.listFiles()) {
            Document doc = new Document();
            doc.add(new StringField("path", tmp.getCanonicalPath(),
                    Field.Store.YES));
            doc.add(new TextField("content", TxtUtils.readTxt(tmp),
                    Field.Store.YES));
            writer.addDocument(doc);
            writer.commit();
        }
    }

    /**
     * 创建索引写入器
     *
     * @param indexPath
     *            索引存储路径
     * @return
     * @throws IOException
     */
    public static IndexReader createIndexReader(String indexPath)
            throws IOException {
        return DirectoryReader.open(FSDirectory.open(new File(indexPath)));
    }

    /**
     * 创建索引搜索器
     *
     * @param reader
     *            索引写入器
     * @return
     */
    public static IndexSearcher createIndexSearcher(IndexReader reader) {
        return new IndexSearcher(reader);
    }

    /**
     * 执行搜索
     *
     * @param searcher
     *            搜索器
     * @param target
     *            搜索对象
     * @return
     * @throws IOException
     */
    public static TopDocs executeSearch(IndexSearcher searcher, Query query)
            throws IOException {
        return searcher.search(query, 10000);
    }

    /**
     * 展示查询结果
     *
     * @param docs
     *            查询结果文档
     * @throws IOException
     */
    public static void showResult(TopDocs docs, IndexReader reader)
            throws IOException {
        Document doc = null;
        for (ScoreDoc tmp : docs.scoreDocs) {
            doc = reader.document(tmp.doc);
            System.out.println(tmp.score + "  " + doc.get("path"));
            // System.out.println(doc.getField("path").stringValue());
        }
    }
}

拆的比较琐碎了,凑合看吧。

创建索引的类:

package com.zhyea.doggie;

import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.index.IndexWriter;

import com.zhyea.util.FileUtil;

public class IndexTest{

    String indexPath = "D:\\aqsiqDevelop\\workspace3\\doggie\\WebContent\\index";
    String docPath = "D:\\aqsiqDevelop\\workspace3\\doggie\\WebContent\\docs";

    public static void main(String[] args){
        try{
            new IndexTest().createIndex();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 创建索引
     * @throws IOException
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
    private void createIndex() throws IOException,
                                      InstantiationException,
                                      IllegalAccessException{
        IndexWriter writer = null;
        try{
            Analyzer analyzer = DoggieLucene.createAnalyzer(SmartChineseAnalyzer.class);
            writer = DoggieLucene.createIndexWriter(analyzer, indexPath);
            DoggieLucene.addLocalDocument(writer, docPath);
        }finally{
            if(null!=writer)writer.close();
        }
    }
}

执行搜索的类:

package com.zhyea.doggie;

import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;

public class SearchTest {

    String indexPath = "D:\\aqsiqDevelop\\workspace3\\doggie\\WebContent\\index";

    public static void main(String[] args){
        try{
            new SearchTest().executeSearch();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public void executeSearch() throws ParseException,
                                       IOException,
                                       InstantiationException,
                                       IllegalAccessException{
        IndexReader reader = null;
        try{
            reader = DoggieLucene.createIndexReader(indexPath);
            IndexSearcher searcher = DoggieLucene.createIndexSearcher(reader);
            Analyzer analyzer = DoggieLucene.createAnalyzer(SmartChineseAnalyzer.class);
            Query query = new QueryParser("content", analyzer).parse("杨过");
            TopDocs docs = DoggieLucene.executeSearch(searcher, query);
            DoggieLucene.showResult(docs, reader);
        }finally{
            if(null!=reader)reader.close();
        }
    }
}

OK。

时间: 12-20

lucene学习-3 - 代码重构的相关文章

妮子的iOS 代码重构1

昨天面试,被问了个代码重构,直接愣住了... 回来稍微看了下,对代码重构有了一点了解...就是让自己的代码有更好的结构,更简洁易读吧,是提高代码质量的一种方法吧!Xcode提供了几个代码重构功能,有Rename(重命名).Extract.Create Superclass.Move Up.Move Down.Encapsulate. 使用:在代码区右击——Refactor,调出重构功能.Rename用于对类名.方法名.属性名等重命名,Extract用于将自己写的一段代码变成一个方法,Create

CSS代码重构

CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS代码重构主要有两个目的:1.提高代码性能2.提高代码的可维护性 提高代码性能 提高CSS代码性能主要有两个点:1.提高页面的加载性能提高页面的加载性能,简单说就是减小CSS文件的大小,提高页面的加载速度,尽可以的利用http缓存2.提高CSS代码性能不同的CSS代码,浏览器对其解析的速度也是不一样的,如何提高浏览器解析CSS代码的速度也是我们要考虑的 提高代码的可维护性 提高CS

CSS代码重构与优化之路

写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多,如果没有及时对CSS代码进行维护,CSS代码不断会越来越多.CSS代码交错复杂,像一张庞大的蜘蛛网分布在网站的各个位置,你不知道修改这行代码会有什么影响,所以如果有修改或增加新功能时,开发人员往往不敢去删除旧的冗余的代码,而保险地增加新代码,最终的坏处就是项目中的CSS会越来越多,最终陷入无底洞. CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS

代码重构的时机与要点

代码重构的结果至关重要 对于程序员来说,重构的意义似乎不需多说,大家公认的干净的代码是更好的. 在非程序员主导的项目中,做重构则需要对结果有更多的负责,一旦重构带来更多的bug以及进度的delay,重构本身就会被怀疑,牛逼和逗比只在一线之间. 重构的时机 最好的时机就是task收尾阶段:子task结束就清理子task的代码,大task结束就清理大task的代码. 有这么几个原因: - 测试资源:一部分代码一旦经过QA测试之后,本身的成本就上升了(程序员+QA的投入),如果重构发生在QA测试之后,

我的代码重构经验

说明 本文在<MDU某产品OMCI模块代码质量现状分析>一文的基础上,分享作者对该模块进行重构时的实践经验. 具体的重构手段可参考<代码大全2>或<重构:改善既有代码的设计>,本文不再班门弄斧,而侧重重构时一些粗浅的“方法论”,旨在提高重构效率. 作者未采用重量级的重构工具,仅用到Source Insight的”Smart Rename”功能.也未使用CUnit等单元测试工具,而是通过在线调测和自动化测试保证代码的正确性. 一 背景 MDU系列产品从他处接手,OMCI模

lucene学习笔记(三)

好几天没更新了.更新一下,方便自己和大家学习. 这是最基本的代码 package index; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document;

Windows程序代码重构

代码重构:在程序功能实现之后,对代码进行一定规模的整理,使之符合"高内聚.低耦合"的软件设计原则,便于维护和使用. ①用函数封装消息处理代码--对Windows程序窗口函数中的每一个case程序段进行封装以形成一个消息处理函数,而在case中调用这个函数. ②利用数组或链表实现消息映射表进一步实现代码的隔离--因为窗口函数switch-case结构实质上实现的就是一个根据消息标识来查找消息处理代码的功能,故可以用消息映射表和一段查表程序来替代它,表中的每一项可以使用一个函数指针来指向消

Job Service代码重构遐想

最近有大概半个月的时间可以重构下代码,刚好可以重新整理下Job Service相关的代码.前段时间由于忙于完成Job Service所有功能以及完成对Auto Job的支持以正常上线,使得有些地方的代码写得不是特别优雅.主要集中在以下一些地方: DAG状态的转移 目前DAG状态分为3层,分别为ApplicationStatus.TaskStatus.InstanceStatus.每个层次都有以下几种状态,Waiting.Running.Finished.Stopped.Failed.并且DAG有

第九课、计算器界面代码重构

一.重构的概念 1.重构是以改善代码质量为目的代码重写 (1).使其软件的设计和架构更加合理 (2).提高软件的扩展性和维护性 2.代码实现和代码重构的不同 (1).代码实现:按照设计编程实现,重在实现功能 (2).代码重构:以提高代码质量为目的软件架构优化 (3).区别 A.代码实现时不考虑架构的好坏,只考虑功能的实现 B.代码重构时不影响已实现的功能,只考虑架构的改善 3.软件开发的过程 (1).从工程的角度对软件开发中的活动进行定义和管理 4.什么样的代码需要重构 (1).当发现项目中重复

step 1 代码重构

代码重构 代码重构介绍 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ?                     新建方法 ?                     把要抽取的代码,直接复制到新方法中 ?                     根据需求调整参数 2  调整旧代码 ?                     注释原代码,给自己一个后悔的