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

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

两个工具类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。

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

  1. .NET 云原生架构师训练营(权限系统 代码重构)--学习笔记

    目录 模块拆分 代码重构 模块拆分 代码重构 AuthenticationController PermissionController IAuthorizationMiddlewareResultH ...

  2. CSS代码重构与优化之路

    作者:@狼狼的蓝胖子 网址:http://www.cnblogs.com/lrzw32/p/5100745.html 写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多, ...

  3. CSS代码重构

    CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS代码重构主要有两个目的:1.提高代码性能2.提高代码的可维护性 提高代码性能 提高 ...

  4. Lucene学习总结之七:Lucene搜索过程解析

    一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...

  5. .NET - 代码重构技巧

    通过面向对象三大特性:封装.继承.多态的学习,可以说我们已经掌握了面向对象的核心.接下来的学习就是如何让我们的代码更优雅.更高效.更易读.更易维护.当然了,这也是从一个普通程序员到一个高级程序员的必由 ...

  6. Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...

  7. 第五次作业2、请将该code进行代码重构,使之模块化,并易于阅读和维护;

    1.请运行下面code,指出其功能: (需附运行结果截图,并用简短文字描述其功能) 显示了人的姓名.年龄 2.请将该code进行代码重构,使之模块化,并易于阅读和维护: 3.观看视频The Exper ...

  8. Web前端开发最佳实践(2):前端代码重构

    前言 代码重构是业内经常讨论的一个热门话题,重构指的是在不改变代码外部行为的情况下进行源代码修改,所以重构之前需要考虑的是重构后如何才能保证外部行为不改变.对于后端代码来说,可以通过大量的自动化测试来 ...

  9. CSS代码重构与优化

    CSS代码重构的基本方法 前面说到了CSS代码重构的目的,现在我们来说说一些如何达到这些目的的一些基本方法,这些方法都是易于理解,容易实施的一些手段,大家平时可能也不知不觉地在使用它. 提高CSS性能 ...

随机推荐

  1. Python之实现简单计算器功能

    一,需求分析 要求计算一串包含数字+-*/()的类似于3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)表达式的数值 二,知识点 正 ...

  2. etcd跨机房部署方案

    使用ETCD做为元数据方便快捷,但是谈到跨机房灾备可能就迷糊了,我们在做节日灾备的时候同样遇到了问题, 通过查阅官方文档找到了解决方案,官方提供make-mirror方法,提供数据镜像服务 注意: m ...

  3. SQSERVER--函数、开窗函数,-特殊的内容 (for xml path )

    1.STUFF SQL Server之深入理解STUFF sql stuff函数用于删除指定长度的字符,并可以在制定的起点处插入另一组字符.sql stuff函数中如果开始位置或长度值是负数,或者如果 ...

  4. Oracle Schema Objects——Tables——Overview of Tables

    Oracle Schema Objects Overview of Tables A table is the basic unit of data organization in an Oracle ...

  5. Oracle重做日志REDO

    什么是重做? 重做日志包含所有数据产生的历史改变记录. 重做日志目的是保证数据的安全,如果数据因特殊原因没有写到磁盘上,可以通过重做日志来恢复. 重做日志文件通常用于 恢复(实例恢复和介质恢复) 日志 ...

  6. Word Formation

    构词 Word Formation 1.派生Derivation 2.合成Compounding 3.截短Clipping 4.混合Blending 1派生Derivation 1).前缀 除少数英语 ...

  7. Ansi、GB2312、GBK、Unicode(utf8、16、32)

    关于ansi,一般默认为本地编码方式,中文应该是gb编码 他们之间的关系在这边文章里描写的很清楚:http://blog.csdn.net/ldanduo/article/details/820353 ...

  8. 【我的Android进阶之旅】Android Studio如何轻松整理字符串到string.xml中

    使用Android Studio一段时间了,还有很多小技巧没有掌握.比如:平常将字符串整理到string.xml中,都是手动的去复制字符串到string.xml中,然后再回来修改引用该字符串的代码,这 ...

  9. Notepad++ 更换主题

    到Textmate Theme Directory下载主题: 用文本编辑器把它打开,复制所有代码,贴到theme converter page里,然后“Download”: 保存: 在Notepad+ ...

  10. Java-idea-创建maven项目,部署项目,部署服务器,简单测试

    spring-boot项目创建 1.项目创建 使用Idea,File→Project→Spring initalizr,点击next,进行基本配置.此时 一个spring boot项目创建完成. 之后 ...