Lucene(6.2.1)基于StoredField的deleteDocuments

时间:2017-05-28 15:54:29

标签: search indexing lucene full-text-search

我在索引中使用的StoredFieldTextField很少(Lucene 6.2.1)

对于每个文档我都有自己的唯一ID

如果我创建字段为

 Field docID = new TextField("docID", docId, Field.Store.YES);

我可以像下面那样删除文件

Field transactionIdField = new TextField("transactionId", transactionId, Field.Store.YES);      
Term docIdTerm = new Term("docID", docId);
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter writer = repositoryWriters.getTargetIndexWriter(repositoryUuid);

// 4. remove document with docId
writer.deleteDocuments(docIdTerm);
LOG.log(Level.INFO, "Document removed from Index, docID: {0}", docId);
writer.commit();

但是如果我创建字段为

 Field docID = new SttoredField("docID", docId);

文件未删除

如何根据存储的字段值删除文档?

我想将它保存为StoredField,因此用户无法根据docID搜索文档

1 个答案:

答案 0 :(得分:1)

引用StoredField文档,

  

一个字段,其值存储为IndexSearcher.doc和   IndexReader.document()将返回该字段及其值。

即。它只是文档的存储字段,并且该字段没有条款或索引。

方法,IndexWriter.deleteDocuments(Term...terms)找不到该文档,因为StoredField没有任期。

另一方面,TextField被编入索引并为其生成术语

  

索引和标记化的字段,没有术语向量。对于   例如,这将用于包含批量的“body”字段   一份文件的文字。

存储的TextField被编入索引并存储,因此术语可用,并且存储值以重新构建文档。

因此,在sumamry中,您不能仅基于StoredField删除文档,您也需要一个索引字段 - 具有相同的名称才能删除它。