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

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

两个工具类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. HDU 1875 畅通工程再续(kruskal)

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  2. responsive and functional programming RxJava

    RxJava由于使用了多个回调,一开始理解起来可能有点难度,其实多看几遍也就明白了,它的招式套路都是一样的: 首先就是创建Observable,创建Observable有很多种方式,这里使用了Obse ...

  3. php中get_cfg_var()和ini_get()的用法及区别

    php里get_cfg_var()和ini_get()都是取得配置值的函数,当你需要获取php.ini里的某个选项的配置值时,这两个函数都都可以使用,得到的结果是一样的. 不过,get_cfg_var ...

  4. Android Paint setXfermode

     背景: dst        前景: src  PorterDuff.Mode.CLEAR 清除画布上图像 PorterDuff.Mode.XOR 取两层图像的非交集部门 PorterDuff.Mo ...

  5. 简明python教程六----编写一个python脚本

    备份程序: #!/usr/bin/python #Filename:backup_ver1.py import os import time source = ['/home/liuxj/python ...

  6. 为Eclipse指定JVM

    运行eclipse时,报如下错误时,可以通过修改配置文件eclipse.ini来解决. Version 1.4.1_01 of the JVM is not suitable for this pro ...

  7. java项目地址和服务器地址区分

    项目地址String filePath = request.getSession().getServletContext().getRealPath("/") + "up ...

  8. js高级---js运行原理

    概述 浏览器组成可分两部分:Shell+内核.浏览器内核又可以分成两部分:渲染引擎(layout engineer或者Rendering Engine)和JS引擎.渲染引擎功能作用 渲染引擎,负责对网 ...

  9. Unity,自带Random函数,上下限注意的地方

    Random.Range() 该函数有两个重载,分别是 float和 int 的,这两者还是有差别的,具体是: float型,随机值涵盖: 最小和最大值 Random.Range(0f,1f) 是有可 ...

  10. Spring 之定义切面尝试(基于注解)

    [Spring 之定义切面尝试] 1.标记为深红色的依赖包是必须的 <dependency> <groupId>org.springframework</groupId& ...