0

我继承了一些使用 Simple Lucene 的代码。我对简单的 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 存储 blob。为了做到这一点,我依赖于在以下位置找到的库:https ://github.com/richorama/AzureDirectory 。

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

4

1 回答 1

0

看起来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,遍历一个实体列表,将它们转换为文档,并通过 writer 将它们添加到索引中,并返回一个计数。

您表示您从包中返回了一个 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);
于 2013-01-21T22:34:26.123 回答