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做简单的文件索引的更多相关文章

  1. lucene 内存索引 和文件索引 合并

    IndexWriter.addIndexes(ramDirectory); http://blog.csdn.net/qq_28042463/article/details/51538283 在luc ...

  2. B树、B-树、B+树、B*树介绍,和B+树更适合做文件索引的原因

    今天看数据库,书中提到:由于索引是采用 B 树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会出现大量的存储碎片, 这和磁盘碎片.内存碎片产生原理是类似的,这些存储碎 ...

  3. 使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能。并且在界面上有radio 的选择内容也要上传

    使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能.并且在界面上有radio 的选择内容也要上传 uploadify 插件的 下载和文档地址  ...

  4. 2、Lucene 最简单的使用(小例子)

    在了解了Lucene以后,我打算亲手来做一个Lucene的小例子,这个例子只是Lucene最简单的应用:使用Lucene实现标准的英文搜索: 1.下载Lucene 下载Lucene,到Lucene的官 ...

  5. 用Lucene.net对数据库建立索引及搜索<转>

    用Lucene.net对数据库建立索引及搜索 最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个 ...

  6. Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程

    2.Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程 2014-12-07 23:39 2623人阅读 评论(0) ...

  7. Lucene的配置及创建索引全文检索

    Lucene 是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言).Lucene ...

  8. Lucene.Net简单例子-01

    前面已经简单介绍了Lucene.Net,下面来看一个实际的例子 1.1 引用必要的bll文件.这里不再介绍(Lucene.Net  PanGu  PanGu.HightLight  PanGu.Luc ...

  9. 用Lucene对文档进行索引搜索

    问题 现在给出很多份文档,现在对某个搜索词感兴趣,想找到相关的文档. 简单搜索 一种简单粗暴的做法是: 1.读取每个文档:2.找到其中含有搜索词的文档:3.对找到的文档中搜索词出现的次数统计:4.根据 ...

随机推荐

  1. 【Maven】Missing artifact com.oracle:ojdbc14:jar:10.2.0.4.0

    1.到 http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html 下载你所需要的oraclejar包 2.在 ...

  2. 代理丶通知丶KVO之间区别和各自优势

    文/OyeOnoOmg(简书作者)原文链接:http://www.jianshu.com/p/75d3fd218a23著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 今天在网上看到一个 ...

  3. 自定义ActionBar背景(分别针对3.0以下和3.0以上的版本)

    官方原文:http://developer.android.com/training/basics/actionbar/styling.html 针对3.0以上的版本: <?xml versio ...

  4. 配置SecureCRT连接Linux CentOS

    链接地址:http://f.dataguru.cn/thread-144513-1-1.html 环境:Linux:centos5.8虚拟机:VirtualBox本机:windows至于怎么安装Cen ...

  5. android 4.2 root

    前一段因工作需要,对android4.2 进行root.但是在下载了 点击打开链接,下载了Superuser.apk,把对应的apk拷贝到system/app,su拷贝到/system/bin 与/s ...

  6. 用Flask实现视频数据流传输

    Flask 是一个 Python 实现的 Web 开发微框架.这篇文章是一个讲述如何用它实现传送视频数据流的详细教程. 我敢肯定,现在你已经知道我在O’Reilly Media上发布了有关Flask的 ...

  7. Java -- WeakHashMap

    一.引言 Java中的引用类型由四种情况,强引用.软引用.弱引用.虚引用.关于这些的介绍可以参见鄙人另外一篇博文.                                           ...

  8. 常用位操作,写8位 12864串口模式 I2C 1302 18B20

    /*以1302为例*/ void DS1302InputByte(unsigned char d)  //实时时钟写入一字节(内部函数) {     unsigned char i;     ACC ...

  9. mysql如何开启远程连接

    链接地址:http://jingyan.baidu.com/article/046a7b3ed85f3ef9c27fa9dc.html 大家在公司工作中,经常会遇到mysql数据库存储于某个人的电脑上 ...

  10. Python 第九篇:队列Queue、生产者消费者模型、(IO/异步IP/Select/Poll/Epool)、Mysql操作

    Mysql操作: grant select,insert,update,delete on *.* to root@"%" Identified by "123456&q ...