1.创建索引

  

package com.DingYu.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StoredField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test; /**
* 我们的目标是把索引和文档存入索引库中, 所以首先我们需要创建一个索引库 然后创建一个IndexWrite对象把索引,和文档对象写入,
* 文档对象中需要自己设置域,索引是通过分词器对域进行分词产生的, 所以我们需要分词器
*
* @author 丁宇
*
*/
public class LuceneTest {
/**
* 创建索引
* @throws IOException
*/
@Test
public void createIndex() throws IOException {
// 标准分词器
Analyzer analyzer = new StandardAnalyzer();
// 创建一个索引
Directory directory = FSDirectory.open(Paths.get("D:\\LuceneIndex"));
// 创建一个IndexWriteConfig对象
IndexWriterConfig config = new IndexWriterConfig(analyzer);
// 创建一个IndexWrite对象
IndexWriter write = new IndexWriter(directory, config);
// 获得所有文件下的文件
File[] files = new File("D:\\LuceneTest").listFiles();
for (File file : files) {
// 创建一个文档对象
Document document = new Document();
// 增加一个filepath域,不分析 不索引 但会存储在索引库里 把文件路径放到域中
Field field1 = new StoredField("filepath", file.getPath());
// 增加一个filename域,会分词,会索引,
Field field2 = new org.apache.lucene.document.TextField("filename", file.getName(), Store.YES);
// 增加一个fileContent域,会分词,会索引,只放文件内容的索引
Field field3 = new org.apache.lucene.document.TextField("filecontent", fileContent(file), Store.NO);
// 增加一个filesize域,不分析 不索引 但会存储在索引库里 把文件路径放到域中
Field field4 = new StoredField("filesize", file.length());
document.add(field1);
document.add(field2);
document.add(field3);
document.add(field4);
write.addDocument(document);
}
write.close();
}
/**
* 获得文件内容
* @param file
* @return
*/
public String fileContent(File file) {
byte[] fileContent = new byte[(int) file.length()];
FileInputStream in = null;
try {
in = new FileInputStream(file);
} catch (FileNotFoundException e2) {
e2.printStackTrace();
}
try {
in.read(fileContent);
} catch (IOException e1) {
e1.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
return new String(fileContent, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}

2.查询索引

package com.DingYu.Test;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths; import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test; /**
* 查询索引
*
* @author 丁宇
*
*/
public class LuceneTest1 {
// 获得IndexSearcher对象
private IndexSearcher getIndexSearcher() throws IOException {
// 指定索引库
Directory directory = FSDirectory.open(Paths.get("D:\\LuceneIndex"));
// 打开索引库
IndexReader reader = DirectoryReader.open(directory);
// 创建查询的对象
IndexSearcher searcher = new IndexSearcher(reader);
return searcher;
} // 输出查到的内容
private void printIndex(TopDocs docs,IndexSearcher searcher) throws IOException {
// 获得顶部匹配记录
ScoreDoc[] scoreDocs = docs.scoreDocs;
// 获得在索引库中存着的文档的id,利用id去寻找文档
for (ScoreDoc scoreDoc : scoreDocs) {
// 获得id
int doc = scoreDoc.doc;
// 获得文档
Document document = searcher.doc(doc);
// 获得这个文档的域
System.out.println(document.get("filename"));
System.out.println(document.get("filecontent"));
System.out.println(document.get("filepath"));
System.out.println(document.get("filesize"));
System.out.println("------------------------");
}
}
/**
* 精准查询
* @throws IOException
*/
@Test
public void termQueryIndex() throws IOException { IndexSearcher searcher = getIndexSearcher();
// 选择合适的查询方法,这里用最简单的,具体的看下图
Query query = new TermQuery(new Term("filename", "txt"));
// 执行查询
TopDocs docs = searcher.search(query, 2);
//输出查询内容
printIndex(docs, searcher);
// 关闭索引库
searcher.getIndexReader().close();
}
/**
* 范围查询 五个参数 第一个域名,第二个第三个表示范围,第四个第五个表示是否包含最小值和最大值。
* @throws IOException
*/
@Test
public void numRangeQueryIndex() throws IOException {
IndexSearcher searcher = getIndexSearcher();
// 选择合适的查询方法,这里用最简单的,具体的看下图
Query query = NumericRangeQuery.newLongRange("filesize", 0L, 1000L, true, true);
// 执行查询
TopDocs docs = searcher.search(query, 2);
//输出查询内容
printIndex(docs, searcher);
// 关闭索引库
searcher.getIndexReader().close();
}
/**
* 组合查询
* @throws IOException
*/
@Test
public void booleanQueryIndex() throws IOException {
IndexSearcher searcher = getIndexSearcher();
BooleanQuery booleanQuery = new BooleanQuery();
Query query = new TermQuery(new Term("filename","txt"));
Query query2 = NumericRangeQuery.newLongRange("filesize", 0L, 1000L, true, true);
//表示query是必须的 query2也是必须 相当于并集
booleanQuery.add(query,Occur.MUST);
booleanQuery.add(query2, Occur.MUST);
// 执行查询
TopDocs docs = searcher.search(query, 2);
//输出查询内容
printIndex(docs, searcher);
// 关闭索引库
searcher.getIndexReader().close();
}
}

3.删除索引

package com.DingYu.Test;

import java.io.IOException;
import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test; /**
* 删除索引 一般增删改都是同一个操作对象 这里使用IndexWriter对象
*
* @author 丁宇
*
*/
public class LuceneTest3 {
/**
* 获得IndexWrite对象
* @return
* @throws IOException
*/
public IndexWriter getIndexWrite() throws IOException {
Analyzer analyzer = new StandardAnalyzer();
Directory directory = FSDirectory.open(Paths.get("D:\\LuceneIndex"));
IndexWriterConfig config = new IndexWriterConfig(analyzer);
return new IndexWriter(directory, config);
} /**
* 删除所有的索引
*
* @throws IOException
*/
@Test
public void deleteAllIndex() throws IOException {
IndexWriter indexWrite = getIndexWrite();
indexWrite.deleteAll();
indexWrite.close();
}
/**
* 根据条件删除索引,同时删除文档
* @throws IOException
*/
@Test
public void deleteSomeIndex() throws IOException {
IndexWriter indexWrite = getIndexWrite();
Query query = new TermQuery(new Term("filename","txt"));
indexWrite.deleteDocuments(query);
indexWrite.close();
}
}

4.修改索引

package com.DingYu.Test;

import java.io.IOException;
import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test; /**
* 索引的修改
* @author 丁宇
*
*/
public class LuceneTest2 { private IndexWriter getIndexWriter() throws IOException {
Analyzer analyzer = new StandardAnalyzer();
Directory directory = FSDirectory.open(Paths.get("D:\\LuceneIndex"));
IndexWriterConfig config = new IndexWriterConfig(analyzer);
return new IndexWriter(directory, config);
} @Test
public void updateIndex() throws IOException {
IndexWriter indexWriter = getIndexWriter();
Document document = new Document();
document.add(new StringField("filename", "think in java", Store.YES));
//update 就是删除一个你指定的 创建一个你想要的 。
indexWriter.updateDocument(new Term("filecontent","txt"), document);
indexWriter.close();
}
}

Lucene的简单用法的更多相关文章

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

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

  2. CATransition(os开发之画面切换) 的简单用法

    CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...

  3. jquery.validate.js 表单验证简单用法

    引入jquery.validate.js插件以及Jquery,在最后加上这个插件的方法名来引用.$('form').validate(); <!DOCTYPE html PUBLIC " ...

  4. NSCharacterSet 简单用法

    NSCharacterSet 简单用法 NSCharacterSet其实是许多字符或者数字或者符号的组合,在网络处理的时候会用到 NSMutableCharacterSet *base = [NSMu ...

  5. [转]Valgrind简单用法

    [转]Valgrind简单用法 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian S ...

  6. Oracle的substr函数简单用法

    substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串 subst ...

  7. Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  8. TransactionScope简单用法

    记录TransactionScope简单用法,示例如下: void Test() { using (TransactionScope scope = new TransactionScope()) { ...

  9. WPF之Treeview控件简单用法

    TreeView:表示显示在树结构中分层数据具有项目可展开和折叠的控件 TreeView 的内容是可以包含丰富内容的 TreeViewItem 控件,如 Button 和 Image 控件.TreeV ...

随机推荐

  1. nohup和&后台运行,进程查看及终止

    1.nohup 用途:不挂断地运行命令. 语法:nohup Command [ Arg … ] [ & ] 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup ...

  2. Windows 10 IoT Core 17133 for Insider 版本更新

    今天,微软发布了Windows 10 IoT Core 17133 for Insider 版本更新,本次更新只修正了一些Bug,没有发布新的特性.用户可以登录Windows Device Porta ...

  3. MySQL优化技巧

    目录 MySQL的特点 数据类型优化 整型类型 小数类型 字符串类型 时间类型 主键类型的选择 特殊类型的数据 索引优化 一个使用Hash值创建索引的技巧 前缀索引 多列索引 聚簇索引 覆盖索引 重复 ...

  4. Spring-Data-Jpa环境配置与实际应用

    上次我们讲述了<Spring-Data-Jpa概述与接口>,接下来我们再讲讲Spring-Data-Jpa环境配置与实际应用. Spring-Data 方法定义规范与使用配置 简单条件查询 ...

  5. JAVA泛型实现原理

    1. Java范型时编译时技术,在运行时不包含范型信息,仅仅Class的实例中包含了类型参数的定义信息.泛型是通过java编译器的称为擦除(erasure)的前端处理来实现的.你可以(基本上就是)把它 ...

  6. Javascript高级编程学习笔记(30)—— BOM(4)navigator对象

    window对象作为浏览器的全局对象.location对象保存了页面的url信息 那么navigator对象又有什么作用呢? navigator对象 该对象最早由 Netspace Navigator ...

  7. 每天学点SpringCloud(十一):Hystrix仪表盘

    在SpringCloud学习系列博客第六篇文章中,我们已经学习了Hystrix的使用,但是那篇文章中有一点遗漏没有讲,那就是Hystrix Dashboard ,它可以实时的监控Hystrix的运行情 ...

  8. LabVIEW(一):知识入门

    一.DAQ基础知识简介 1.DAQ是英文Data Acquisition (数据采集)的缩写. 数据采集(DAQ)是指测量:电压.电流.温度.压力.声音.编码数据等电气或物理现象的过程. 2.数据采集 ...

  9. 用python自制微信机器人,定时发送天气预报

    0 引言 前段时间找到了一个免费的天气预报API,费了好段时间把这个API解析并组装成自己想用的格式了,就想着如何实现每天发送天气信息给自己.最近无意中发现了wxpy库,用它来做再合适不过了.以下是w ...

  10. Jenkins 忘记admin密码拯救方法

    突然有一日发现自己忘记了jenkins的管理员密码,因为我一直登录的是另外一个非管理员账户.如果出现必须要使用管理员账户操作的,比如用户管理那里的,必须要管理员账号吧,这就尴尬了. 很方的我打开安装j ...