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。
lucene学习-3 - 代码重构的更多相关文章
- .NET 云原生架构师训练营(权限系统 代码重构)--学习笔记
目录 模块拆分 代码重构 模块拆分 代码重构 AuthenticationController PermissionController IAuthorizationMiddlewareResultH ...
- CSS代码重构与优化之路
作者:@狼狼的蓝胖子 网址:http://www.cnblogs.com/lrzw32/p/5100745.html 写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多, ...
- CSS代码重构
CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS代码重构主要有两个目的:1.提高代码性能2.提高代码的可维护性 提高代码性能 提高 ...
- Lucene学习总结之七:Lucene搜索过程解析
一.Lucene搜索过程总论 搜索的过程总的来说就是将词典及倒排表信息从索引中读出来,根据用户输入的查询语句合并倒排表,得到结果文档集并对文档进行打分的过程. 其可用如下图示: 总共包括以下几个过程: ...
- .NET - 代码重构技巧
通过面向对象三大特性:封装.继承.多态的学习,可以说我们已经掌握了面向对象的核心.接下来的学习就是如何让我们的代码更优雅.更高效.更易读.更易维护.当然了,这也是从一个普通程序员到一个高级程序员的必由 ...
- Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息
Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...
- 第五次作业2、请将该code进行代码重构,使之模块化,并易于阅读和维护;
1.请运行下面code,指出其功能: (需附运行结果截图,并用简短文字描述其功能) 显示了人的姓名.年龄 2.请将该code进行代码重构,使之模块化,并易于阅读和维护: 3.观看视频The Exper ...
- Web前端开发最佳实践(2):前端代码重构
前言 代码重构是业内经常讨论的一个热门话题,重构指的是在不改变代码外部行为的情况下进行源代码修改,所以重构之前需要考虑的是重构后如何才能保证外部行为不改变.对于后端代码来说,可以通过大量的自动化测试来 ...
- CSS代码重构与优化
CSS代码重构的基本方法 前面说到了CSS代码重构的目的,现在我们来说说一些如何达到这些目的的一些基本方法,这些方法都是易于理解,容易实施的一些手段,大家平时可能也不知不觉地在使用它. 提高CSS性能 ...
随机推荐
- 带jsk证书,请求https接口
首先是三个返回的实体类 BaseVo.java package https2; import java.io.Serializable; import java.lang.reflect.Invoca ...
- 密码验证连续多位相同或者顺序字符引发的思考.md
目录 密码验证连续多位相同或者顺序字符引发的思考 需求 思考 实现 总结 参考 密码验证连续多位相同或者顺序字符引发的思考 需求 虽然用户对于这种复杂的密码验证恨之入骨,但是有时出于安全的考虑,我们系 ...
- 并发编程7 管道&事件&信号量&进程池(同步和异步方法)
1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...
- sql 锁类型与锁机制
SQL Server锁类型(SQL)收藏1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项 ...
- 利用kubeadm部署kubernetes 1.7 with flannel
一.Installation 1.安装环境为CentOS 7 2.安装Docker yum install -y docker systemctl enable docker systemctl st ...
- Django HttpResponse对象详解
HttpResponse对象 Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数.那么视图函数在处理完相关的逻辑后,也需要返回一个响 ...
- POJ_1195 Mobile phones 【二维树状数组】
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/33802561 题目链接:id=1195&qu ...
- WireShark告诉你ping百度时都发生了什么
备注: 测试机器为Mac 重点展示本机发出icmp的过程(dns-->arp-->icmp) 本机默认网关 ->route -n get e -n get default rout ...
- alter session set events
.alter session set events 一.Oracle跟踪文件 Oracle跟踪文件分为三种类型,一种是后台报警日志文件,记录数据库在启动.关闭和运行期间后台进程的活动情况,如表空 ...
- c++ 11 bind function
Year 2011陈 良乔C++11 FAQ std::function 和 std::bind 标准库函数bind()和function()定义于头文件中(该头文件还包括许多其他函数对象),用于处理 ...