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 索引的增删改查的更多相关文章

  1. elasticsearch索引的增删改查入门

    为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful接口URL的格式: http://localhost:9200/<index>/&l ...

  2. 列表(索引切片 增删改查 嵌套) range 元组的初识

    li = ["alex", "WuSir", "ritian", "barry", "wenzhou" ...

  3. lucene_03_索引的增删改查

    lucene索引的添加见 http://www.cnblogs.com/getchen/p/8615276.html 入门代码. 公共代码 public <T extends Query> ...

  4. Java solr 索引数据增删改查

    具体代码如下: import java.io.IOException; import java.util.*; import org.apache.solr.client.solrj.SolrClie ...

  5. elasticsearch java索引的增删改查

    1.创建索引并插入数据 Map<String, Object> json = new HashMap<String, Object>(); json.put("use ...

  6. Elasticsearch 索引文档的增删改查

    利用Elasticsearch-head可以在界面上(http://127.0.0.1:9100/)对索引进行增删改查 1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演 ...

  7. Es图形化软件使用之ElasticSearch-head、Kibana,Elasticsearch之-倒排索引操作、映射管理、文档增删改查

    今日内容概要 ElasticSearch之-ElasticSearch-head ElasticSearch之-安装Kibana Elasticsearch之-倒排索引 Elasticsearch之- ...

  8. 分布式搜索elasticsearch 索引文档的增删改查 入门

    1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful接口URL的格式: http://localhost:9200/ ...

  9. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

随机推荐

  1. C++能在三个地方创造对象,而Delphi只有一个地方

    C++能在堆栈.堆.资料区创造对象. 但是Delphi只能在堆上创造对象

  2. <转载>div+css布局教程之div+css常见布局结构定义

    在使用div+css布局时,首先应该根据网页内容进行结构设计,仔细分析和规划你的页面结构,你可能得到类似这样的几块: 页面层容器.页面头部.标志和站点名称.站点导航(主菜单).主页面内容.子菜单.搜索 ...

  3. Spring3.0 入门进阶(1):从配置文件装载Bean

    Spring 已经盛行多年,目前已经处于3.0阶段,关于Spring的概念介绍性的东西网上已经很多,本系列博客主要是把一些知识点通过代码的方式总结起来,以便查阅. 作为入门,本篇主要介绍Bean的加载 ...

  4. Mac 安装配置启动Tomcat

    Tomcat Mac 下的安装: TomCat 下载地址,例如: http://tomcat.apache.org/download-70.cgi 在Mac 上下载的时候,下载tar.gz包 下载完成 ...

  5. [置顶] ArcGIS发布最新的 ArcGIS Runtime SDK for Android v10.1.1

    因为希望有统一的地图解决方案,就是PC端,移动端的数据一致,看到ArcGIS的最新发布,感兴趣的可以围观. 链接:http://blogs.esri.com/esri/arcgis/2013/09/0 ...

  6. KMP原理、分析及C语言实现

    (是在matrix67博客基础上整理而来,整理着:华科小涛@http://www.cnblogs.com/hust-ghtao/) 有些算法可以让人发疯,KMP算法就是一个.在网上找了很多资料讲的都让 ...

  7. Tomcat详细用法学习(三)

    本篇接上一篇<Tomcat详细用法学习(二)>,主要讲解服务器所要求的web应用的组织结构. 上一篇说到了如何使用服务器将自己的web应用映射成虚拟目录,以便于在浏览器中可以对自己开发的w ...

  8. 在MyEclipse中复制web工程时要注意的事项

    有时候我们要在MyEclipse中将一个WEB工程进行复制,然后将工程名进行重命名,但这样还是会出错,因为只改变工程名还不够,一般在MyEclipse中WEB工程的[WebRoot]目录名和工程名是一 ...

  9. C#递归复制文件夹

    /// <param name="sources">原路徑</param> /// <param name="dest">目 ...

  10. 查看内存数据的函数(ByteToHex和ByteToBin,最终都变成String)

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...