I've come across this piece of code in a project that I've been working on and was wondering if there's a more efficient way to bulk-update items. I know there is no in-library bulk update and we'll have to loop through documents, but this seemed messy to me.

Any assistance would be greatly appreciated

Trevor

----------- C# Code Start  -----------
public static int BulkUpdateField(string indexPath, string queryString, string fieldName, object newValue)
        {
            int rowCount = 0;

            // Create needed Lucene connections
using (IndexReader reader = IndexReader.Open(new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(indexPath))))
            using (Lucene.Net.Analysis.Analyzer analyzer = getAnalyzer())
using (Lucene.Net.Search.Searcher searcher = getSearcher(indexPath)) using (IndexWriter writer = new IndexWriter(new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(indexPath)), false, analyzer, false))
            {

                // Create query
Lucene.Net.QueryParsers.QueryParser qp = new Lucene.Net.QueryParsers.QueryParser("FileId", analyzer);
                Query query = qp.Parse(queryString);
                // Run query (to get total count of documents)
                TopDocs td = searcher.Search(query, 1);
                // Make sure there are documents
                if (td.TotalHits == 0)
                    return 0;

                // Get all documents in query
                td = searcher.Search(query, td.TotalHits);

                // Foreach document
                foreach (ScoreDoc doc in td.ScoreDocs)
                {
                    rowCount++;

                    // Update document
                    Document currentDoc = reader.Document(doc.Doc);
currentDoc.GetField(fieldName).SetValue(newValue.ToString());
                    // Resave document
writer.UpdateDocument(new Term("FileId", currentDoc.GetField("FileId").StringValue()), currentDoc);
                }

                // Clean out deletes from UpdateDocument
                writer.ExpungeDeletes();

                // Save to index
                writer.Commit();
                // Close connections
                writer.Close();
                reader.Close();
                searcher.Close();
                analyzer.Close();
            }

            return rowCount;
        }
----------- C# Code End -----------

Reply via email to