lucene4.4 索引的增删改查
package com.lucene.test;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;
import org.apache.log4j.Logger;
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.IntField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.DocsAndPositionsEnum;
import org.apache.lucene.index.Fields;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.MultiFields;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.Version;
publicclass IndexUtil {
privatestaticfinal Logger LOGGER = Logger.getLogger(IndexUtil.class);
private Directory directory = null;
private DirectoryReader reader = null;
private IndexWriterConfig config = null;
private IndexWriter writer = null;
publicstaticfinal IndexUtil Instance = new IndexUtil();
private IndexUtil() {
try {
directory = FSDirectory.open(new File("D:/lucene/index"));
config = new IndexWriterConfig(Version.LUCENE_44,
new StandardAnalyzer(Version.LUCENE_44));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*添加索引
*@throwsIOException
*/
publicvoid index() throws IOException {
writer = new IndexWriter(directory, config);
File file = new File("D:\\lucene\\example");
Document document = null;
int id = 0;
long start = new Date().getTime();
LOGGER.info("添加索引…………………………");
for (File f : file.listFiles()) {
document = new Document();
document.add(new StringField("name",f.getName(), Store.YES));
document.add(new IntField("id", id++,Store.YES));
document.add(new StringField("path",f.getAbsolutePath(), Store.YES));
document.add(new TextField("context", new FileReader(f)));
writer.addDocument(document);
}
long end = new Date().getTime();
LOGGER.info("添加索引完成,用时:" + (end - start) / 1000.0 + "s…………………………");
writer.close();
}
/**
*查询索引
*@throwsIOException
*@throwsParseException
*/
publicvoid search() throws IOException, ParseException {
reader = DirectoryReader.open(directory);
QueryParser parser = newQueryParser(Version.LUCENE_44, "context",
new StandardAnalyzer(Version.LUCENE_44));
Query query = parser.parse("lucene");
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs docs = searcher.search(query,100);
/**
*reader.maxDoc()包含索引文档的总数包含可用的和已经删除的数量
*reader.numDocs()当前可用的索引文档的数量不包含已经删除的
*reader.numDeletedDocs()删除的索引文档的数量
*/
LOGGER.info("总记录:" + docs.totalHits + " 命中文档数:" + docs.scoreDocs.length
+ " 最大的文档数maxDoc:" + reader.maxDoc() + " 删除文件数numDeletedDocs:"
+ reader.numDeletedDocs() + " numDocs" + reader.numDocs());
for (ScoreDoc doc : docs.scoreDocs) {
Document document = reader.document(doc.doc);
LOGGER.info("id:" +document.get("id") + " name:"
+ document.get("name") + " path:" + document.get("path"));
}
reader.close();
}
/**
*更新索引
*@throwsIOException
*/
publicvoid update() throws IOException {
writer = new IndexWriter(directory, config);
Document document = new Document();
document.add(new StringField("name", "新文件", Store.YES));
document.add(new IntField("id", 12, Store.YES));
document.add(new StringField("path", "D:\\lucene\\example\\新文件.txt", Store.YES));
writer.updateDocument(new Term("id", "2"),document);
writer.commit();
writer.close();
}
/**
*删除索引删除的索引会保存到一个新的文件中(以del为结尾的文件相当于删除到回收站)
*@throwsIOException
*/
publicvoid delete() throws IOException {
writer = new IndexWriter(directory, config);
writer.deleteDocuments(new Term("name", "11.txt"));
writer.close();
}
/**
*删除所有的索引删除的索引会保存到一个新的文件中(以del为结尾的文件相当于删除到回收站)
*@throwsIOException
*/
publicvoid deleteAll() throws IOException {
writer = new IndexWriter(directory, config);
writer.deleteAll();
writer.close();
}
/**
*删除已经删除的索引对应上一个删除方法删除回收站的文件
*@throwsIOException
*/
publicvoid forceMergeDeletes() throws IOException {
writer = new IndexWriter(directory, config);
writer.forceMergeDeletes();// 清空回收站
writer.close();
}
/**
*显示所有的索引
*@throwsIOException
*/
publicvoid showIndex() throws IOException {
reader = DirectoryReader.open(directory);
Fields fields = MultiFields.getFields(reader); //获取directory中所有的field
for (String field : fields) {
LOGGER.info(field);
}
//显示 field 中 context的所有的分词
Terms terms = fields.terms("context");
TermsEnum termsEnum = terms.iterator(null);
BytesRef term = null;
while ((term=termsEnum.next()) !=null) {
System.out.print(term.utf8ToString()+"\t");//分词的内容
System.out.print(termsEnum.docFreq()+"\t");//出现该分词的有文档的数量
System.out.print(termsEnum.totalTermFreq()+"\t");//分词的总数
DocsAndPositionsEnumdocsAndPositionsEnum = termsEnum.docsAndPositions(null, null);
//如果要查询的字段没有被分词,docsAndPositionsEnum就会为空继续循环
if(docsAndPositionsEnum==null){
continue;
}
int docId ;
while ((docId = docsAndPositionsEnum.nextDoc())!= DocIdSetIterator.NO_MORE_DOCS) {
Document document = reader.document(docId);//获取document对象
System.out.print(docId+"\t");//分词的总数
System.out.print(document.get("name")+"\t");//可以获取document中field的值
int freq = docsAndPositionsEnum.freq();//该document中该分词出现的次数
for (int i = 0; i < freq; i++) {
System.out.print(docsAndPositionsEnum.nextPosition()+":"); //分词的位置
System.out.print("["+docsAndPositionsEnum.startOffset()+"");//分词起始偏移量的位置
System.out.print(docsAndPositionsEnum.endOffset()+"],");//分词结束偏移量的位置
System.out.print(docsAndPositionsEnum.getPayload()+"\t");
}
}
System.out.println();
}
reader.close();
}
}
lucene4.4 索引的增删改查的更多相关文章
- elasticsearch索引的增删改查入门
为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful接口URL的格式: http://localhost:9200/<index>/&l ...
- 列表(索引切片 增删改查 嵌套) range 元组的初识
li = ["alex", "WuSir", "ritian", "barry", "wenzhou" ...
- lucene_03_索引的增删改查
lucene索引的添加见 http://www.cnblogs.com/getchen/p/8615276.html 入门代码. 公共代码 public <T extends Query> ...
- Java solr 索引数据增删改查
具体代码如下: import java.io.IOException; import java.util.*; import org.apache.solr.client.solrj.SolrClie ...
- elasticsearch java索引的增删改查
1.创建索引并插入数据 Map<String, Object> json = new HashMap<String, Object>(); json.put("use ...
- Elasticsearch 索引文档的增删改查
利用Elasticsearch-head可以在界面上(http://127.0.0.1:9100/)对索引进行增删改查 1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演 ...
- Es图形化软件使用之ElasticSearch-head、Kibana,Elasticsearch之-倒排索引操作、映射管理、文档增删改查
今日内容概要 ElasticSearch之-ElasticSearch-head ElasticSearch之-安装Kibana Elasticsearch之-倒排索引 Elasticsearch之- ...
- 分布式搜索elasticsearch 索引文档的增删改查 入门
1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful接口URL的格式: http://localhost:9200/ ...
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
随机推荐
- webBrowser中操作网页元素全攻略
原文 webBrowser中操作网页元素全攻略 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBr ...
- c#实现Javascript的encodeURIComponent()函数
原文 c#实现Javascript的encodeURIComponent()函数 国内外各搜索引擎,均用JavaScript的encodeURIComponent()函数对搜索关键字进行编码,终于找 ...
- ADO.NET 操作数据库 --- 01 简单封装
由于我是Java转的C#开始的时候就用的NHihernate,和EF 对ADO.NET使用较少,现在封装一个ADO.NET的工具类来实现数据库的操作,比较简单,望大家多多提意见. 如果大家有什么学习中 ...
- 1941. Scary Martian Word
1941. Scary Martian Word 这道题 一个长度为3的字符串视为 一个 火星文 字母(ASCII 33-122) ,给出一个火星人认为恐怖的单词(由火星字母组成) 然后 给你一篇文章 ...
- 符号文件(.pdb)——Windows 应用程序调试必备
最近在做项目需求过程中,时不时会遇到崩溃,总是异常中断,于是学习了windbg进行调试的一些基础,windbg在接下来文章进行更新,先介绍在windbg调试中一个重要文件(符号文件) 一.符号文件定义 ...
- (step8.2.7)hdu 1517(A Multiplication Game——巴什博弈变形)
题目大意:输入一个整数n.谁先报的数大于n,谁就输了.(初始值p == 1 , 后一个人报的数必须在前一个人报的数的基础上乘上(2 ~ 9)之间的任意一个数) 解题思路:巴什博奕的变形 1) 解题思 ...
- hdu 1421 搬寝室 (dp)
思路分析: dp[i][j] 表示选取到第 i 个 组成了 j 对的最优答案. 当然排序之后 选取相邻两个是更优的. if(i==j*2) dp[i][j] = dp[i-2][j-1] + w[ ...
- eclipse导入myeclipse的web项目没法识别问题解决方法
1.进入项目目录,找到.project文件,打开. 2.找到<natures>...</natures>代码段. 3.在第2步的代码段中加入如下标签内容并保存: <nat ...
- Moss、SharePoint数据库迁移问题(转)
当项目快做完时,大家都要考虑将程序及数据迁移到正式环境部署.但是,如果用SharePoint开发,它会产生很多数据库,到底哪些需要迁移,哪些不需要迁移了?? 请看: 1.配置完成SharePoint后 ...
- boost::asio 连接管理11 如何关闭连接
在实际产品运行中,对连接管理有了更新的认识,这里分享一下. shared_ptr管理连接对象的生命周期 shared_ptr的引用计数器决定了连接对象的生命周期.这里我说的连接对象就是在我的前文:ht ...