【问题标题】:Lucene Update Document IndexLucene 更新文档索引
【发布时间】:2013-02-25 15:14:04
【问题描述】:

我按照这篇文章 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;
}

【问题讨论】:

    标签: c# asp.net-mvc entity-framework asp.net-mvc-4 lucene.net


    【解决方案1】:

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

    【讨论】:

    • 知道如何检查文档是否存在然后将其删除?
    【解决方案2】:

    我们使用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多