我修改了lucene的demo包的IndexHTML类,使其可以被其他Java类调用。
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermEnum;
import java.io.File;
import java.util.Date;
import java.util.Arrays;
//还需调用demo的其他类。
import org.apache.lucene.demo;
/**
* Create html file index for searching
* @author tyrone
*
*/
public class IndexHTML {
private String DocsPath=null;
/**
* the path for index file;
*/
private String IndexFilePath=null;
/**
* true during deletion pass
*/
private boolean deleting = false;
/**
* existing index
*/
private IndexReader reader;
/**
* new index being built
*/
private IndexWriter writer;
/**
* document id iterator
*/
private TermEnum uidIter;
private void indexDocs(File file)throws Exception {
if (file.isDirectory()) { // if a directory
String[] files = file.list(); // list its files
Arrays.sort(files); // sort the files
for (int i = 0; i < files.length; i++) // recursively index them
this.indexDocs(new File(file, files[i]));
} else if (file.getPath().endsWith(".html") || // index .html files
file.getPath().endsWith(".htm") || // index .htm files
file.getPath().endsWith(".txt")) { // index .txt files
if (this.uidIter != null) {
String uid = HTMLDocument.uid(file); // construct uid for doc
while (uidIter.term() != null && uidIter.term().field() == "uid" &&
uidIter.term().text().compareTo(uid) < 0) {
if (deleting) { // delete stale docs
System.out.println("deleting " +
HTMLDocument.uid2url(uidIter.term().text()));
reader.delete(uidIter.term());
}
uidIter.next();
}
if (uidIter.term() != null && uidIter.term().field() == "uid" &&
uidIter.term().text().compareTo(uid) == 0) {
uidIter.next(); // keep matching docs
} else if (!deleting) { // add new docs
Document doc = HTMLDocument.Document(file);
System.out.println("adding " + doc.get("url"));
writer.addDocument(doc);
}
} else { // creating a new index
Document doc = HTMLDocument.Document(file);
System.out.println("adding " + doc.get("url"));
writer.addDocument(doc); // add docs unconditionally
}
}
return;
}
/**
* Walk directory hierarchy in uid order, while keeping uid iterator from
* existing index in sync. Mismatches indicate one of:
* (a) old documents to be deleted;
* (b) unchanged documents, to be left alone;
* or (c) new documents, to be indexed.
*/
private void indexDocs(File file, String index, boolean create)
throws Exception {
if (!create) { // incrementally update
reader = IndexReader.open(index); // open existing index
uidIter = reader.terms(new Term("uid", "")); // init uid iterator
this.indexDocs(file);
if (deleting) { // delete rest of stale docs
while (uidIter.term() != null && uidIter.term().field() == "uid") {
System.out.println("deleting " +
HTMLDocument.uid2url(uidIter.term().text()));
reader.delete(uidIter.term());
uidIter.next();
}
deleting = false;
}
uidIter.close(); // close uid iterator
reader.close(); // close existing index
} else // don't have exisiting
this.indexDocs(file);
}
/**
* if create=true, create a new index, else refresh old index.
* @param create
*/
public void run(boolean create) {
try {
String index = "index";
File root = null;
if (this.IndexFilePath!=null) { // index file path
index = this.IndexFilePath;
}
if (this.DocsPath==null){
System.out.println("root directory is not set");
return;
}
root = new File(this.DocsPath);
Date start = new Date();
/**
* not create then maintenance
*/
if (!create) { // delete stale docs
this.deleting = true;
this.indexDocs(root, index, create);
}
writer = new IndexWriter(index, new StandardAnalyzer(), create);
writer.maxFieldLength = 1000000;
this.indexDocs(root, index, create); // add new docs
System.out.println("Optimizing index...");
writer.optimize();
writer.close();
Date end = new Date();
System.out.print(end.getTime() - start.getTime());
System.out.println(" total milliseconds");
} catch (Exception e) {
System.out.println(" caught a " + e.getClass() +
"\n with message: " + e.getMessage());
}
return;
}
/**
* @return Returns the IndexFilePath.
*/
public String getIndexFilePath() {
return IndexFilePath;
}
/**
* @param IndexFilePath The IndexFilePath to set.
*/
public void setIndexFilePath(String property1) {
this.IndexFilePath = property1;
}
/**
* @return Returns the DocsPath.
*/
public String getDocsPath() {
return DocsPath;
}
/**
* @param DocsPath The DocsPath to set.
*/
public void setDocsPath(String property1) {
this.DocsPath = property1;
}
/**
* test
* @param args
*/
public static void main(String[] args){
IndexHTML ih=new IndexHTML();
ih.setDocsPath("D:\\MyProject\\colimas\\clms-doc2\\html");
ih.setIndexFilePath("D:\\MyProject\\colimas\\index");
ih.run(true);
}
}
运行后生成3个文件_3i8.cfs,deletable,segments
搜索文件类:
/*
* Created on 2005/07/28
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package com.nova.colimas.search.query;
/**
* @author tyrone
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class HitsHTMLDoc {
private String Title;
private String Path;
private String Url;
/**
* @return Returns the Url.
*/
public String getUrl() {
return Url;
}
/**
* @param Url The Url to set.
*/
public void setUrl(String property1) {
this.Url = property1;
}
/**
* @return Returns the Path.
*/
public String getPath() {
return Path;
}
/**
* @param Path The Path to set.
*/
public void setPath(String property1) {
this.Path = property1;
}
/**
* @return Returns the Title.
*/
public String getTitle() {
return Title;
}
/**
* @param Title The Title to set.
*/
public void setTitle(String property1) {
this.Title = property1;
}
}
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Hits;
import org.apache.lucene.queryParser.QueryParser;
/**
* @author tyrone
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class SearchFiles {
private Hits hits;
public Hits getHits(){
return hits;
}
public HitsHTMLDoc[] run(String indexFilePath,String line){
HitsHTMLDoc[] hitdocs;
try {
Searcher searcher = new IndexSearcher(indexFilePath);
Analyzer analyzer = new StandardAnalyzer();
Query query = QueryParser.parse(line, "contents", analyzer);
System.out.println("Searching for: " + query.toString("contents"));
this.hits = searcher.search(query);
if (this.hits.length()==0) return null;
System.out.println(this.hits.length() + " total matching documents");
hitdocs=new HitsHTMLDoc[this.hits.length()];
for (int i = 0; i < hits.length(); i++) {
Document doc = this.hits.doc(i);
String path = doc.get("path");
if (path != null) {
hitdocs[i].setPath(path);
} else {
String url=doc.get("url");
if (url != null) {
hitdocs[i]=new HitsHTMLDoc();
hitdocs[i].setUrl(url);
String title=doc.get("title");
if (title!=null)
hitdocs[i].setTitle(title);
} else {
System.out.println(i + ". " + "No path nor URL for this document");
}
}
}
searcher.close();
return hitdocs;
}catch(Exception e){
System.out.println(" caught a " + e.getClass() +
"\n with message: " + e.getMessage());
}
return null;
}
/**
* test
* args=queries
* @author tyrone
*
*/
public static void main(String[] args){
SearchFiles se=new SearchFiles();
String query="";
HitsHTMLDoc[] hitsdoc;
for (int i=0;i<args.length;i++)
query=query+args[i]+" ";
hitsdoc=se.run("D:\\MyProject\\colimas\\index",query);
if (hitsdoc==null){
System.out.println("nothing");
return;
}
for (int l=0;l<hitsdoc.length;l++){
System.out.println("url:"+hitsdoc[l].getUrl());
System.out.println("path:"+hitsdoc[l].getPath());
System.out.println("title:"+hitsdoc[l].getTitle());
}
}
}
注意事项:
1 引用lucene debug你的应用程序时虽然不需要下面的jar包,但每次会提示URLClassPath.class异常,为方便起见还是下载这些jar包。
relaxngDatatype.jar
commons-beanutils.jar
commons-collections.jar
commons-digester.jar
commons-logging.jar
commons-validator.jar
jakarta-oro.jar
struts-legacy.jar
2 生成index文件的目录里不能有其他目录,如果有则会试图删除或报错
分享到:
相关推荐
Amazon S3:S3静态网站托管教程.docx
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
CPPC++_半透明效果,大多数的win32飞出
mondo离线包
VID_20241112_234319.mp4
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
基于C/C++实现根据人类手写汉字图片-使用机械臂复写汉字+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于C/C++实现根据人类手写汉字图片-使用机械臂复写汉字+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于C/C++实现根据人类手写汉字图片-使用机械臂复写汉字+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 项目简介: 实现根据人类手写汉字,使用机械臂复写汉字 项目目的 完成将相机拍摄的人类手写汉字图像; 通过halcon处理为骨架图片; 再将其剪枝、转换为矢量图; 最后使用UR3机械臂抓握笔将其复写出。
mysql5.7 win版本压缩包
CatBoost使用的一个小例子,包含代码和数据。 代码解释的博文为:https://blog.csdn.net/u013172930/article/details/143723670
cppc++
CPPC++_基于ImGui和OpenGL的桌面GUI开发框架 很遗憾项目已荒废
Python小项目之皮卡丘
使用springboot搭建的音乐,电影,书栈,视频教程app的后台项目,所有数据来自互联网,使用python爬虫抓取,涉及,负载
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
ApachePOI是Apache软件基金会的开源代码库,POI提供了Java程序操作Office格式文件的功能。
基于python的分布式爬虫
分布式事务尝试
cppc++