一、索引库的添加
1、Field域的属性
是否分析:是否对域的内容进行分词处理。前提是我们要对域的内容进行查询。
是否索引:将Field分析后的词或整个Field值进行索引,只有索引方可搜索到。
比如:商品名称、商品简介分析后进行索引,订单号、身份证号不用分析但也要索引,这些将来都要作为查询条件。
是否存储:将Field值存储在文档中,存储在文档中的Field才可以从Document中获取
比如:商品名称、订单号,凡是将来要从Document中获取的Field都要存储。
是否存储的标准:是否要将内容展示给用户
Field类 |
数据类型 |
Analyzed 是否分析 |
Indexed 是否索引 |
Stored 是否存储 |
说明 |
StringField(FieldName, FieldValue,Store.YES)) |
字符串 |
N |
Y |
Y或N |
这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如(订单号,姓名等) 是否存储在文档中用Store.YES或Store.NO决定 |
LongPoint(String name, long... point) |
Long型 |
Y |
Y |
N |
可以使用LongPoint、IntPoint等类型存储数值类型的数据。让数值类型可以进行索引。但是不能存储数据,如果想存储数据还需要使用StoredField。 |
StoredField(FieldName, FieldValue) |
重载方法,支持多种类型 |
N |
N |
Y |
这个Field用来构建不同类型Field 不分析,不索引,但要Field存储在文档中 |
TextField(FieldName, FieldValue, Store.NO) 或 TextField(FieldName, reader)
|
字符串 或 流 |
Y |
Y |
Y或N |
如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略. |
2、添加文档代码实现
①、添加前效果
②、代码实现
package com.zn; import org.apache.lucene.document.*; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.store.FSDirectory; import org.junit.jupiter.api.Test; import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.File; import java.io.IOException; /** * 索引维护 */ public class DocumentTest { /** * 索引添加 */ @Test public void creatDocument() throws IOException { //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath()), new IndexWriterConfig(new IKAnalyzer())); //创建一个文档对象 Document document=new Document(); document.add(new TextField("fieldName","AddDocument.txt", Field.Store.YES)); document.add(new StoredField("fieldPath","C://AddDocument.txt")); document.add(new LongPoint("fieldSize",123)); document.add(new StoredField("fieldSize",123)); document.add(new TextField("fieldContent","新添加的文档的内容", Field.Store.YES)); //创建索引,将文档添加到索引库当中 indexWriter.addDocument(document); //关闭 indexWriter.close(); } }
③、添加后效果
二、索引库的删除
1、全部删除
将索引目录的索引信息全部删除,直接彻底删除,无法恢复。此方法慎用!!
①、删除前效果
②、代码实现
package com.zn; import org.apache.lucene.document.*; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.store.FSDirectory; import org.junit.jupiter.api.Test; import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.File; import java.io.IOException; /** * 索引维护 */ public class DocumentTest { /** * 索引删除:删除全部 */ @Test public void deleteAllDocument() throws IOException { //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath()), new IndexWriterConfig(new IKAnalyzer())); //删除索引 indexWriter.deleteAll(); //关闭 indexWriter.close(); } }
③、执行后效果
2、根据域或关键词删除
①、删除前效果
②、代码实现
package com.zn; import org.apache.lucene.document.*; 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.FSDirectory; import org.junit.jupiter.api.Test; import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.File; import java.io.IOException; /** * 索引维护 */ public class DocumentTest { /** * 索引删除:根据域或关键词删除 */ @Test public void deleteByFieldAndTermDocument() throws IOException { //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath()), new IndexWriterConfig(new IKAnalyzer())); //定义一个删除条件,定义一个查询对象 Query query=new TermQuery(new Term("fieldName","AddDocument.txt")); //删除 indexWriter.deleteDocuments(query); //关闭 indexWriter.close(); } }
③、删除后效果
三、索引库的修改
原理就是先删除后添加。
1、修改前效果
2、代码实现
package com.zn; import org.apache.lucene.document.*; 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.FSDirectory; import org.junit.jupiter.api.Test; import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.File; import java.io.IOException; /** * 索引维护 */ public class DocumentTest { /** * 索引修改:先删除再修改 */ @Test public void updateDocument() throws IOException { //创建IndexWriter对象 参数一:索引库位置 参数二:指定配置 IndexWriter indexWriter=new IndexWriter(FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath()), new IndexWriterConfig(new IKAnalyzer())); //创建一个文档对象 Document document=new Document(); document.add(new TextField("fieldName","UpdateDocument.txt", Field.Store.YES)); document.add(new StoredField("fieldPath","C://UpdateDocument.txt")); document.add(new LongPoint("fieldSize",456)); document.add(new StoredField("fieldSize",456)); document.add(new TextField("fieldContent","修改fieldName为AddDocument的文档,进行文档替换", Field.Store.YES)); //修改 indexWriter.updateDocument(new Term("fieldName","AddDocument.txt"),document); //关闭 indexWriter.close(); } }
3、修改后效果