我在索引中使用的StoredField
和TextField
很少(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搜索文档
答案 0 :(得分:1)
引用StoredField
文档,
一个字段,其值存储为IndexSearcher.doc和 IndexReader.document()将返回该字段及其值。
即。它只是文档的存储字段,并且该字段没有条款或索引。
方法,IndexWriter.deleteDocuments(Term...terms)
找不到该文档,因为StoredField
没有任期。
另一方面,TextField
被编入索引并为其生成术语
索引和标记化的字段,没有术语向量。对于 例如,这将用于包含批量的“body”字段 一份文件的文字。
存储的TextField
被编入索引并存储,因此术语可用,并且存储值以重新构建文档。
因此,在sumamry中,您不能仅基于StoredField
删除文档,您也需要一个索引字段 - 具有相同的名称才能删除它。