1

我按照这篇文章http://leoncullens.nl/post/2012/11/18/Full-Text-Search-on-Azure-with-LuceneNET.aspx来设置 Lucene 索引。

它在大多数情况下运行顺利我如何编辑它,以便如果存在与 id 绑定的现有文档以删除它然后重新插入它?

编辑以下方法:

public void CreateIndex() {


IndexWriter indexWriter = new IndexWriter(_directory, new StandardAnalyzer(Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED); // Create    the IndexWriter

    foreach (Book book in _bookService.List()) // Use whatever data source you like
    {
        // NEED TO INSERT A CHECK HERE TO SEE IF A DOC EXISTS
        Document document = CreateBookDocument(book); // Create a 'Document' for each row of your data

        indexWriter.AddDocument(document);
    }

    try
    {
        indexWriter.Optimize(); // Call optimize once to improve performance
        indexWriter.Dispose(); // Commit and dispose the object

        Thread.Sleep(60 * 10 * 1000); // Sleep 10 minutes when the index is created successfully, otherwise immediately restart the process
    }
    catch (Exception)
    {
        indexWriter.Rollback();
        indexWriter.Dispose();
    }
}

private Document CreateBookDocument(Book book)
{
    Document document = new Document();
    document.Add(new Field("Id", book.Id.ToString(), Field.Store.YES, Field.Index.NO, Field.TermVector.NO)); // We want to store the ID so we can retrieve data for the ID, but we don't want to index it because it is useless searching through the IDs
    document.Add(new Field("Title", book.Title, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
    document.Add(new Field("Publisher", book.Publisher, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
    document.Add(new Field("Isbn10", book.Isbn10, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));

    return document;
}
4

2 回答 2

1

据我了解,实际上并没有在 Lucene 中更新 Document 实例。它总是作为删除/插入完成。

于 2013-02-25T20:24:45.477 回答
1

我们使用 Lucene.Net 2.0.0.4,而对于 3.0,我认为它们是相同的。

首先您需要将 ID 添加为Field.Index.TOKENIZED,然后您可以修改(先删除然后插入)索引。

document.Add(new Field("Id", book.Id.ToString(), Field.Store.YES, Field.Index.TOKENIZED));

然后打开索引而不是创建新的

IndexWriter indexWriter = new IndexWriter(_directory, new StandardAnalyzer(Version.LUCENE_30), false, IndexWriter.MaxFieldLength.UNLIMITED);

有删除示例代码:

IndexReader reader = IndexReader.Open(_directory);
reader.DeleteDocuments(new Term("Id", book_id_delete));
reader.Close();
于 2013-04-17T17:49:12.310 回答