在Simple Lucene中使用IndexService

本文关键字:IndexService Simple Lucene | 更新日期: 2023-09-27 17:55:19

我继承了一些使用Simple Lucene的代码。我对Simple Lucene知之甚少。现在,代码依赖于IndexService来索引实体。使用以下代码:

using (var indexService = GetIndexService())
{
  indexService.IndexEntities(cachedResults, p =>
  {
    var document = new Document();
    document.Add(new Field("Name", p.Name, Field.Store.YES, Field.Index.NOT_ANALYZED));
    document.Add(new Field("ID", p.ID, Field.Store.YES, Field.Index.NOT_ANALYZED));
    document.Add(new Field("Description", p.Description, Field.Store.YES, Field.Index.NOT_ANALYZED));
    return document;
  });
}

GetIndexService返回一个SimpleLucene.Impl.DirectorySerivce实例。此方法用于在本地计算机上存储索引。但是,现在我需要将其移动到Windows Azure Storage blob。为了做到这一点,我依靠在以下位置找到的库:https://github.com/richorama/AzureDirectory。

此处显示的示例返回一个Lucene.Net.Index.IndexWriter 。我不知道如何将这个对象与那里的方法一起使用。这些类型似乎完全不兼容。我想做的只是为索引文件使用不同的存储位置。有没有办法做到这一点?如果是这样,如何。我在这里完全是一条小溪。谢谢!

在Simple Lucene中使用IndexService

看起来IndexEntities看起来像这样:

public int IndexEntities<TEntity>(DirectoryInfo indexLocation, IEnumerable<TEntity> entities, Func<TEntity, Document> converter)
{
    using (var indexer = new IndexWriterWrapper(indexLocation)) {
        int indexCount = 0;
        foreach (TEntity entity in entities) {
            indexer.Writer.AddDocument(converter(entity));
            indexCount++;
        }
        return indexCount;
    }
}

基本上,它打开一个 IndexWriter,循环访问实体列表,将它们转换为文档,并通过编写器将它们添加到索引中,然后返回计数。

您指示从包中返回一个索引编写器,因此您无需担心创建一个索引编写器。 您正在创建一个文档,因此不需要映射(我想转换器可以对传入的文档进行一些更改,但可能不会),并且您只是在创建一个,因此迭代或计数并不是真正必要的。 剩下的就是添加文档,通过IndexWriter.addDocument(Document)

var writer = //However you get the writer...
var document = new Document();
document.Add(new Field("Name", p.Name, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("ID", p.ID, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("Description", p.Description, Field.Store.YES, Field.Index.NOT_ANALYZED));
writer.addDocument(document);