Ehsan Zaffar
Ehsan Zaffar

Reputation: 33

Lucene (6.2.1) deleteDocuments based on StoredField

I am using few StoredField and few TextField in my indexing (Lucene 6.2.1)

for every document I have my own unique ID

if I create field as

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

I am able to delet document like following

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();

But if I create field as

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

the document is not deleted

How can I delete a document based on a Stored Field Value?

I want to keep it a StoredField so tat users can not search teh document based on docID

Upvotes: 0

Views: 183

Answers (1)

Sabir Khan
Sabir Khan

Reputation: 10142

Quoting StoredField documentation,

A field whose value is stored so that IndexSearcher.doc and IndexReader.document() will return the field and its value.

i.e. it would simply be a stored field for a document and there would be no Terms or Indexing for this field.

Method, IndexWriter.deleteDocuments(Term...terms) wouldn't find that document since there will be no Term for a StoredField.

A TextField on the other hand is indexed and terms generated for it,

A field that is indexed and tokenized, without term vectors. For example this would be used on a 'body' field, that contains the bulk of a document's text.

A stored TextField is indexed as well as stored so terms are available and value is stored to re construct the document too.

So in sumamry, you can't delete a document on the basis of only a StoredField , you need an indexed field too - with same name to be able to delete it.

Upvotes: 1

Related Questions