Monday 12 July 2021

Lucene: Update a document

Lucene provides 'updateDocument', 'updateDocuments' method to update the documents in index.

 

Signature

public long updateDocument(Term term, Iterable<? extends IndexableField> doc) throws IOException

This method updates a document by first deleting the document(s) containing term and then adding the new document. 

 

public long updateDocuments(Term delTerm, Iterable<? extends Iterable<? extends IndexableField>> docs) throws IOException

Atomically deletes documents matching the provided delTerm and adds a block of documents with sequentially assigned document IDs, such that an external reader will see all or none of the documents.

 

Example

Term term = new Term("id", "2");
indexWriter.updateDocument(term, newDoc);

 

DocumentUtil.java

package com.sample.app.util;

import java.util.Arrays;
import java.util.List;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;

public class DocumentUtil {

	public static Document getDocument(String id, String title, String description, String blog) {
		Document doc = new Document();
		doc.add(new TextField("id", id, Field.Store.YES));
		doc.add(new TextField("title", title, Field.Store.YES));
		doc.add(new TextField("description", description, Field.Store.NO));
		doc.add(new TextField("blog", blog, Field.Store.YES));
		
		return doc;

	}

	public static List<Document> getDocuments() {
		Document doc1 = getDocument("1", "JavaWorld",
				"The original independent resource for Java developers, architects, and managers.", " javaworld.com");
		Document doc2 = getDocument("2", "Oracle Blogs | The Java Source",
				" Java powers more than 4.5 billion devices including 800 million computers and 1.5 billion cell phones. If you love Java, this is the blog you must follow.",
				"blogs.oracle.com/java");
		Document doc3 = getDocument("3", "A Java geek",
				"Nicolas Fränkel's blog. IT architect focusing on Java, Java EE, and their surrounding ecosystems. He is a trainer, book writer, speaker & blogger.",
				"blog.frankel.ch");
		Document doc4 = getDocument("4", "Self Learning Java", "Learn Java fundamentals and other java libraries",
				"self-learning-java-tutorial.blogspot.com");

		return Arrays.asList(doc1, doc2, doc3, doc4);

	}
}

 

App.java

package com.sample.app;

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.MultiBits;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.MMapDirectory;
import org.apache.lucene.store.NoLockFactory;
import org.apache.lucene.util.Bits;

import com.sample.app.util.DocumentUtil;

public class App {

	private static void printAllDocuments(Directory directory) throws IOException {

		try (IndexReader indexReader = DirectoryReader.open(directory)) {
			System.out.println("All Documents in Lucene Index");
			Bits liveDocs = MultiBits.getLiveDocs(indexReader);
			for (int i = 0; i < indexReader.maxDoc(); i++) {
				if (liveDocs != null && !liveDocs.get(i))
					continue;

				Document doc = indexReader.document(i);
				System.out.println(doc.get("id") + ", " + doc.get("title"));
			}

			System.out.println();
		}

	}

	public static void main(String args[]) throws IOException {

		Analyzer analyzer = new StandardAnalyzer();
		IndexWriterConfig indexWriterConfig1 = new IndexWriterConfig(analyzer);

		Directory directory = new MMapDirectory(new File("/Users/Shared/lucene").toPath(), NoLockFactory.INSTANCE);

		try (IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig1)) {

			List<Document> documents = DocumentUtil.getDocuments();

			System.out.println("Adding " + documents.size() + " documents to Lucene");
			indexWriter.addDocuments(documents);
			indexWriter.commit();

			printAllDocuments(directory);

			Term term = new Term("id", "2");

			try (IndexReader indexReader = DirectoryReader.open(directory)) {
				IndexSearcher indexSearcher = new IndexSearcher(indexReader);
				Query query = new TermQuery(term);

				TopDocs docs = indexSearcher.search(query, 1);
				ScoreDoc[] hits = docs.scoreDocs;

				Document document = indexSearcher.doc(hits[0].doc);

				Document newDoc = DocumentUtil.getDocument(document.get("id"), "Java Revisited",
						"Java Design Patterns and Java interview Questions", "https://javarevisited.blogspot.com/");

				indexWriter.updateDocument(term, newDoc);
			}

		}
		printAllDocuments(directory);

	}
}

 

Output

Adding 4 documents to Lucene
All Documents in Lucene Index
1, JavaWorld
2, Oracle Blogs | The Java Source
3, A Java geek
4, Self Learning Java

All Documents in Lucene Index
1, JavaWorld
3, A Java geek
4, Self Learning Java
2, Java Revisited

 

 

  

Previous                                                    Next                                                    Home

No comments:

Post a Comment