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

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

两个工具类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. 160623、理解 Promise 的工作原理

    Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doo ...

  2. python之MongoDB学习

    import pymongo as pm # 获取连接 client = pm.MongoClient('localhost', 27017) # 端口号是数值型 # 连接数据库 db = clien ...

  3. 手动爬虫之流程笔记1(python3)

    一.引入拓展库 由于刚刚起步学习爬虫,故从urllib库开始 首先引入urllib,这里主要用到urllib中request类 import urllib.request as ur 二.设置全局参数 ...

  4. Sending 'ccColor4B' (aka 'struct_ccColor4B') to parameter of incompatible type

    今天遇到了如下的一个错误, Sending 'ccColor4B' (aka 'struct_ccColor4B') to parameter of incompatible type CiColor ...

  5. tomcat8以上管理页面提示403问题

    修改conf/tomcat-users.xml <role rolename="manager"/> <role rolename="manager-g ...

  6. C#连接EXCEL和ACCESS字符串2003及2007版

    97-2003版本 EXCEL Provider=Microsoft.Jet.OLEDB.4.0;Data Source=文件位置;ExtendedProperties=Excel 8.0;HDR=Y ...

  7. Linux(4)- centos7安装python3、Linux下安装、配置virtualenv、确保开发环境的一致性、虚拟环境之virtualenvwrapper、vim

    一.centos7安装python3 1.下载python3的源码包 下载地址:https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz cd ...

  8. go——常量

    常量是一个简单值的标识符,在程序运行时,不会被修改的量常量中的数据类型只可以是布尔值.数字型(整数型.浮点型和复数)和字符串.常量的定义格式: const identifier [type] = va ...

  9. Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索"

    Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索" //匹配右边 var   reg: TPerlRegEx; begin   ...

  10. 微信小程序将带来web程序员的春天!

    微信之父张小龙在年初那次演讲中曾表示:“我自己是很多年的程序员,我觉得我们应该为开发的团体做一些事情.”几个月后,微信正式推出微信应用号(即微信小程序)在互联网中掀起又一波热潮. 过去,对于很多开发者 ...