lucene做简单的文件索引
package com.mylucene;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.List; import org.apache.lucene.LucenePackage;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version; public class MyLuceneTest { /**
* 依据内容,构建索引
* @param analyzer
* @param directory
* @param items
* @return
*/
private boolean buildIndexer(Analyzer analyzer, Directory directory, List<Item> items) {
IndexWriter iwriter = null;
try {
// 配置索引
iwriter = new IndexWriter(directory, new IndexWriterConfig(
Version.LUCENE_47, analyzer));
// 删除全部document
iwriter.deleteAll();
// 将文档信息存入索引
Document doc[] = new Document[items.size()];
for (int i = 0; i < items.size(); i++) {
doc[i] = new Document();
Item item = items.get(i);
java.lang.reflect.Field[] fields = item.getClass().getDeclaredFields();
for (java.lang.reflect.Field field : fields) {
String fieldName = field.getName();
// System.out.println(fieldName);
String getMethodName = "get"+toFirstLetterUpperCase(fieldName);
Object obj = item.getClass().getMethod(getMethodName).invoke(item);
//System.out.println((String)obj);
doc[i].add(new Field(fieldName, (String)obj, TextField.TYPE_STORED));
// Field field1 = new Field("", new FileReader(new File("")));
// doc[1].add(field1);
} iwriter.addDocument(doc[i]);
}
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
iwriter.close();
} catch (IOException e) {
}
}
return true;
} /**
* 依据keyword搜索索引
* @param analyzer
* @param directory
* @param keyword
* @return
*/
public List<Item> searchIndexer(Analyzer analyzer, Directory directory, String keyword) {
DirectoryReader ireader = null;
List<Item> result = new ArrayList<Item>();
try {
// 设定搜索文件夹
ireader = DirectoryReader.open(directory);
IndexSearcher isearcher = new IndexSearcher(ireader); // 对多field进行搜索
java.lang.reflect.Field[] fields = Item.class.getDeclaredFields();
int length = fields.length;
String[] multiFields = new String[length];
for (int i = 0; i < length; i++) {
multiFields[i] = fields[i].getName();
}
MultiFieldQueryParser parser = new MultiFieldQueryParser(
Version.LUCENE_47, multiFields, analyzer); // 设定详细的搜索词
Query query = parser.parse(keyword);
ScoreDoc[] hits = isearcher.search(query, null, 10).scoreDocs; for (int i = 0; i < hits.length; i++) {
Document hitDoc = isearcher.doc(hits[i].doc);
Item item = new Item();
for (String field : multiFields) {
String setMethodName = "set"+toFirstLetterUpperCase(field);
item.getClass().getMethod(setMethodName, String.class).invoke(item, hitDoc.get(field));
}
result.add(item);
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
ireader.close();
directory.close();
} catch (IOException e) {
}
}
return result;
} /**
* 首字母转大写
* @param str
* @return
*/
public static String toFirstLetterUpperCase(String str) {
if(str == null || str.length() < 2){
return str;
}
return str.substring(0, 1).toUpperCase() + str.substring(1, str.length());
} public static void main(String[] args) throws Exception {
System.out.println(LucenePackage.get());
MyLuceneTest demo = new MyLuceneTest();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
// Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_47); List<Item> items = new ArrayList<Item>();
/*items.add(new Item("1", "中国", "This is the text to be greatly indexed."));
items.add(new Item("2", "second", "This is great"));
items.add(new Item("3", "third", "I love apple and pear. "));
items.add(new Item("4", "four", "我是中国人"));
items.add(new Item("5", "five", "中华人民共和国")); */File dataFile = new File("C:/mylucene");
File[] dataFiles = dataFile.listFiles();
for(int i = 0; i < dataFiles.length; i++){
Reader txtReader = new FileReader(dataFiles[i]);
char []buff = new char[10000];
txtReader.read(buff);
String str = String.valueOf(buff);
System.out.println(buff);
items.add(new Item(dataFiles[i].getCanonicalPath(),dataFiles[i].getName(),str));
//System.out.println(dataFiles[i].getCanonicalPath());
//System.out.println(dataFiles[i].getName());
//System.out.println(buff);
//System.out.println(txtReader.toString());
} // 索引存到内存中的文件夹
//Directory directory = new RAMDirectory();
// 索引存储到硬盘
File file = new File("c:/lucene");
Directory directory = FSDirectory.open(file);
demo.buildIndexer(analyzer, directory, items);
List<Item> result = demo.searchIndexer(analyzer, directory, "中国"); for (Item item : result) {
System.out.println(item.toString());
}
}
}
package com.mylucene;
public class Item {
private String id;
private String title;
private String content;
public Item() {
}
public Item(String id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[id=").append(id).append(",title=").append(title)
.append(",content=").append(content).append("]");
return sb.toString();
}
}
这里是将文件的的三个属性进行了一下抽象,而且运用还有一个类去表示,在曾经版本号中是运用Reader进行读取文件,而且在文件进行加入索引的时候直接对Reader读取的对象进行加入。不须要将其全部进行读出都进行封装。
这里就是文件很大的时候内存将会存不下,导致内存不足或者数组越界的可能。这里应该还能够像曾经版本号一样能够直接对文件建立索引的。我相信是我没有找到好的解决的方法。所以应该多研究一下4.8的api。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
lucene做简单的文件索引的更多相关文章
- lucene 内存索引 和文件索引 合并
IndexWriter.addIndexes(ramDirectory); http://blog.csdn.net/qq_28042463/article/details/51538283 在luc ...
- B树、B-树、B+树、B*树介绍,和B+树更适合做文件索引的原因
今天看数据库,书中提到:由于索引是采用 B 树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会出现大量的存储碎片, 这和磁盘碎片.内存碎片产生原理是类似的,这些存储碎 ...
- 使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能。并且在界面上有radio 的选择内容也要上传
使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能.并且在界面上有radio 的选择内容也要上传 uploadify 插件的 下载和文档地址 ...
- 2、Lucene 最简单的使用(小例子)
在了解了Lucene以后,我打算亲手来做一个Lucene的小例子,这个例子只是Lucene最简单的应用:使用Lucene实现标准的英文搜索: 1.下载Lucene 下载Lucene,到Lucene的官 ...
- 用Lucene.net对数据库建立索引及搜索<转>
用Lucene.net对数据库建立索引及搜索 最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个 ...
- Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程
2.Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程 2014-12-07 23:39 2623人阅读 评论(0) ...
- Lucene的配置及创建索引全文检索
Lucene 是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene ...
- Lucene.Net简单例子-01
前面已经简单介绍了Lucene.Net,下面来看一个实际的例子 1.1 引用必要的bll文件.这里不再介绍(Lucene.Net PanGu PanGu.HightLight PanGu.Luc ...
- 用Lucene对文档进行索引搜索
问题 现在给出很多份文档,现在对某个搜索词感兴趣,想找到相关的文档. 简单搜索 一种简单粗暴的做法是: 1.读取每个文档:2.找到其中含有搜索词的文档:3.对找到的文档中搜索词出现的次数统计:4.根据 ...
随机推荐
- F - Free DIY Tour(动态规划,搜索也行)
这道题可用动态规划也可以用搜索,下面都写一下 Description Weiwei is a software engineer of ShiningSoft. He has just excelle ...
- linux下安装greenplum
1. 下载 Greenplum Database 源代码 $ git clone https://github.com/greenplum-db/gpdb 2. 安装依赖库 Greenplum Dat ...
- C++创建动态链接库(*.dll)
1. 从 “文件”菜单中,选择 “新建”,然后选择 “项目…”. 2. 在“项目类型”窗格中,选择“Visual C++”下的“Win32”. 3. 在“模板”窗格中,选 ...
- Week3(9月23日):例子更Powerful更完整了,哇咔咔
Part I:提问 =========================== 1.控制器中动作方法的返回类型有哪些? 2.如果控制器代码如下,请问浏览器中如何输入什么路由访问? public clas ...
- Ajax 实现无刷新分页
Ajax 实现无刷新分页
- configure.ac
# # Copyright (C) - Tobias Brunner # Copyright (C) - Andreas Steffen # Copyright (C) - Martin Willi ...
- 用命令行方式关闭linux防火墙
#/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT #/sbin/iptables -I INPUT -p tcp --dport 22 -j A ...
- 上证A股股指跌破1900
上证A股股指跌破1900 有钱的同学赶紧买哦,机会难得哈哈!
- 敲入url到浏览器后会发生什么
浏览器连接DNS服务器,向url服务器请求把url转换为IP地址 DNS服务区返回URL的ip地址 浏览器建立一个TCP链接到web服务器80端口 web服务器发回的html代码 浏览器的渲染器根据h ...
- C/C++ 内存布局详解(经典)(很久前不知哪儿转载的)
一个由C/C++编译的程序除了存放函数二进制代码的程序代码段(code段)外,数据占用的内存大致分为以下几个部分: 1.栈区(stack) 存放局部变量.函数参数.返回数据.返回地址等.系统自动分配释 ...