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. Flume 示例

    1.Syslog Tcp Source sysylog通过配置一个端口,flume能够监控这个端口的数据.如果通往这个端口发送数据可以被flume接收到.可以通过socket发送. #配置文件:sys ...

  2. 深度学习Tensorflow生产环境部署(上·环境准备篇)

    最近在研究Tensorflow Serving生产环境部署,尤其是在做服务器GPU环境部署时,遇到了不少坑.特意总结一下,当做前车之鉴. 1 系统背景 系统是ubuntu16.04 ubuntu@ub ...

  3. Javascript高级编程学习笔记(24)—— 函数表达式(2)闭包

    昨天的文章中主要记录了,函数表达式与函数声明的区别 以及在JS中如何安全地使用递归 那么既然要深入地理解JS中的函数,闭包就是一个绕不开的概念 闭包 JS高编一书中对闭包的概念定义如下: 闭包是指有权 ...

  4. 5.AutoCompleteTextView、自定义广播

    新建信息 布局:自动出来的是系统的组件,里面是listview,写ontextchanglis也行 <LinearLayout xmlns:android="http://schema ...

  5. 细说MySQL数据库操作

    目录 基本语法: 字符集和校验规则 字符集 校验规则 校验规则的影响 数据库操作相关指令 查询数据库版本 显示数据库语句 显示数据库创建语句 数据库删除语句 查看当前数据库有多少个用户在操作 基本语法 ...

  6. 来啊踩fastjson打印入参导致业务跑偏的坑

    线上代码对日志的记录,重要性自不必说.但是怎样记录日志也是有讲究的! 日志可以直接在每个方法中进行日志记录,优点是想怎么记就怎么记,缺点是记日志的代码可能会超过你的业务代码,可读性急剧下降,这也是日志 ...

  7. Easyui学习整理笔记

    目录 (1) 表格双击事件 (2) treegrid传参更新 (3) 设置列表checkbox单选 (4) Easyui实现单行选择和取消选择 @ 对工作中遇到的easyui做一下笔记,不定时更新 ( ...

  8. idea src下源文件和class编译文件不一致

    今天遇到一个神奇BUG,一个和elasticsearch没有任何关系的项目,报错ES某个包找不到,刚开始以为是依赖了父项目的某个包,并且本项目主启动类ComponentScan扫描了相关的类进入Spr ...

  9. ES6之Promise的基本用法

    之前多次看过阮一峰的ES6教程,对Promise也简单的理解过,但是,由于没在项目中运用过,所以记忆的并不深刻,昨天在进行项目的改良,有一个地方需要用到Promise 所以就这样写了: onload函 ...

  10. Linux编程 11(shell全局环境变量与局变环境变量)

    一.概述 在linux中,很多程序和脚本都通过环境变量来获取系统信息,存储临时数据,配置信息.环境变量是指用来存储有关shell会话和工作环境信息,允许你在内存中存储数据,以便程序或shell中运行的 ...