(三)Lucene之删除更新文档以及luke的基本使用
一、demo
- 本例中采用单元测试,故在pom.xml中引入junit jar包
- 1.1 前提:
public class IndexTest {
/**
*数据准备
*/
private String ids[] = { "1", "2", "3" };
private String citys[] = { "qingdao", "nanjing", "shanghai" };
private String descs[] = { "Qingdao is a beautiful city.", "Nanjing is a city of culture.",
"Shanghai is a bustling city." };
@Before
public void setUp() throws IOException {
IndexWriter indexWriter = getIndexWiter();
for (int i = 0; i < ids.length; i++) {
Document document = new Document();
document.add(new StringField("id", ids[i], Field.Store.YES));
document.add(new StringField("city", citys[i], Field.Store.YES));
document.add(new StringField("desc", descs[i], Field.Store.NO));
indexWriter.addDocument(document);
}
indexWriter.close();
}
/**
* 实例化IndexWiter
*
* @return
* @throws IOException
*/
private IndexWriter getIndexWiter() throws IOException {
Directory dir = FSDirectory.open(Paths.get("E:\\lucene2"));
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig conf = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(dir, conf);
return indexWriter;
}
}
1.2 测试写入
/**
* 测试写了几个文档
*
* @throws IOException
*/
@Test
public void tesWritert() throws IOException {
IndexWriter indexWriter = getIndexWiter(); System.out.println("一共写了" + indexWriter.numDocs() + "个文档");
indexWriter.close();
}
结果:

- 使用luke查看索引文件



1.3 测试读取
- 由于进行了1.2 测试写入,所以要把索引文件清理一下,因为此步骤也会产生索引文件
/**
* 测试读取了多少文档
* @throws IOException
*/
@Test
public void testReader() throws IOException {
IndexWriter indexWriter=getIndexWiter();
System.out.println("最大文档数为:"+indexWriter.maxDoc());
System.out.println("当前文档数为:"+indexWriter.numDocs());
indexWriter.close();
}
结果:

1.4 测试删除 在合并前
- 由于进行了1.3 测试写入,所以要把索引文件清理一下,因为此步骤也会产生索引文件
/**
* 测试删除 在合并前
* @throws IOException
*/
@Test
public void testDeleteBeforeMerge() throws IOException {
IndexWriter indexWriter=getIndexWiter();
indexWriter.deleteDocuments(new Term("id","1"));
System.out.println("删除前。。。。。"+indexWriter.numDocs()+"个文件");
indexWriter.commit();
System.out.println("writer.maxDoc():"+indexWriter.maxDoc());
System.out.println("writer.numDocs():"+indexWriter.numDocs());
indexWriter.close();
}
结果:


- 上图可知,虽然indexWriter.deleteDocuments(new Term("id","1")); 删除了document,但是索引文件中不会立即删除。
1.5 测试删除 在合并后
- 由于进行了1.4 测试写入,所以要把索引文件清理一下,因为此步骤也会产生索引文件
- 测试删除 在合并后,用强制删除的方法会立即在索引表删除文档,
这种方法比较耗cpu,建议数据量不大的系统使用,数据量大的系统建议不写indexWriter.forceMergeDeletes(); 就不会立即删除文档
/**
* 测试删除 在合并后,用强制删除的方法会立即在索引表删除文档,
* 这种方法比较耗cpu,建议数据量不大的系统使用,数据量大的系统建议不写indexWriter.forceMergeDeletes(); 就不会立即删除文档
* @throws IOException
*/
@Test
public void testDeleteAfterMerge() throws IOException {
IndexWriter indexWriter=getIndexWiter();
indexWriter.deleteDocuments(new Term("id","1"));
System.out.println("删除前。。。。。"+indexWriter.numDocs()+"个文件");
indexWriter.forceMergeDeletes(); // 强制删除
indexWriter.commit();
System.out.println("writer.maxDoc():"+indexWriter.maxDoc());
System.out.println("writer.numDocs():"+indexWriter.numDocs());
indexWriter.close();
}
结果:


- 如图可知,立即在索引表删除文档,这种方式比较耗cpu,建议数据量不大的系统使用,数据量大的系统建议不写indexWriter.forceMergeDeletes(); 就不会立即删除文档。
1.6 测试更新
- 由于进行了1.5 测试写入,所以要把索引文件清理一下,因为此步骤也会产生索引文件
/**
* 测试更新
* @throws Exception
*/
@Test
public void testUpdate()throws Exception{
IndexWriter writer=getIndexWiter();
Document doc=new Document();
doc.add(new StringField("id", "1", Field.Store.YES));
doc.add(new StringField("city","qingdao",Field.Store.YES));
doc.add(new TextField("desc", "dsss is a city.", Field.Store.NO));
writer.updateDocument(new Term("id","1"), doc);
writer.close();
}
结果:

(三)Lucene之删除更新文档以及luke的基本使用的更多相关文章
- MongoDB(五):更新文档、删除文档
1. 更新文档 MongoDB的uptade()和save()方法用于将集合中的文档更新.update()方法更新现有文档中的值,而save()方法是传递文档数据替换现有文档.从3.2版本开始,Mon ...
- Mongodb(3)插入文档,更新文档,删除文档
insert() 方法 要插入数据到 MongoDB 集合,需要使用 MongoDB 的 insert() 或 save() 方法. 插入文档:db.COLLECTION_NAME.insert(d ...
- MongoDB 教程(七):插入文档、更新文档、删除文档
MongoDB 插入文档 文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式 —— BSON是一种类json的二进制形式的存储格式,简称Binary JSON. MongoDB ...
- 段合并 segments merge 被删除的文档的删除时间
2.5 段合并 每个索引分为多个“写一次,读多次”的段 write once and read many times segments 建立索引时,一个段写入磁盘以后就不能更新:被删除的文档的信息存 ...
- MongoDB 数据库、集合创建删除与文档插入
本文章主要介绍mongodb的基本命令,前提条件,你的本地已经安装了mongo. 一.基本命令使用(主要是创建,增删改.) 0.mongoDb统计信息 获得关于MongoDB的服务器统计,需要在Mon ...
- MongoDB更新文档
说明:来看一下关系型数据库的update语句 UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某 其中where子句就类似查询文本,定位要更改的子表,set子句类似于修改器,更 ...
- ES4:ElasticSearch 使用C#添加和更新文档
这是ElasticSearch 2.4 版本系列的第四篇: 第一篇:ES1:Windows下安装ElasticSearch 第二篇:ES2:ElasticSearch 集群配置 第三篇:ES3:Ela ...
- ES使用C#添加和更新文档
ElasticSearch 使用C#添加和更新文档 这是ElasticSearch 2.4 版本系列的第四篇: 第一篇:ES1:Windows下安装ElasticSearch 第二篇:ES2:Elas ...
- ElasticSearch入门 第四篇:使用C#添加和更新文档
这是ElasticSearch 2.4 版本系列的第四篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
随机推荐
- Postgresql使用coalesce实现类似oracle的NVL方法
COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值. 如果所有的表达式都是空值,最终将 ...
- zsh: no matches found
具体原因: 因为zsh缺省情况下始终自己解释这个 *.h,而不会传递给 find 来解释. 解决办法: 在~/.zshrc中加入: setopt no_nomatch, 然后进行source .zsh ...
- MacOS系统降级
从MacOS 10.14 降级到 10.12,下载好系统镜像文件.打开,复制到Application. 准备一个至少8G的U盘,,打开磁盘工具,『抹掉』(格式化)成Mac OS扩展(日志式),名称可随 ...
- LC 918. Maximum Sum Circular Subarray
Given a circular array C of integers represented by A, find the maximum possible sum of a non-empty ...
- LC 991. Broken Calculator
On a broken calculator that has a number showing on its display, we can perform two operations: Doub ...
- SSD论文学习
SSD: Single Shot MultiBox Detector——目标检测 参考https://blog.csdn.net/u010167269/article/details/52563573 ...
- C# 3DES加密解密,差点要了命
最近 一个项目.net 数据采用3DES加密.下面分享一下,这里的KEY采用Base64编码,便用分发,c#的Byte范围是0-255核心是确定Mode和Padding,关于这两个的意思可以搜索3DE ...
- laravel的ORM转为原生sql
注:mysql测试成功,mongoDB测试失败//将laravel的ORM转为原生sql $SubProfits为laravel的ORM对象 $SubProfits = model::where('i ...
- Hyperledger Fabric1.4 手动搭建过程
1.生成证书: #路径需要更改为自己的路径 cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/first-network ...
- 不使用局部变量和for循环或其它循环打印出如m=19,n=2結果为2 4 8 16 16 8 4 2形式的串
需求:不使用局部变量和for循环或其它循环打印形如:2 4 8 16 16 8 4 2 这样的串 代码MainTest.java package com.szp.study.javase.specia ...