如何让Lucene.net 3.0.3.0与Azure配合使用?

3

好的,我已经努力尝试了2天:我想在Azure工作角色上进行全文搜索。我认为Lucene.NET很适合这个任务。我使用了这个例子:使用AzureDirectory和Lucene.NET 3.0.3.0

我正在使用以下代码:

CloudStorageAccount cloudAccount = CloudStorageAccount.FromConfigurationSetting("CloudStorageSetting");
var cacheDirectory = new RAMDirectory();
AzureDirectory azureDirectory = new AzureDirectory(cloudAccount, "MyCloudIndex", cacheDirectory);
Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
IndexWriter indexWriter = new IndexWriter(azureDirectory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);

使用Lucene.Net 3.0.3.0和Lucene.Net.Store.Azure 1.0.5.1,在Azure SDK 1.8上。我也尝试了旧版Lucene.NET(2.9.xxx),但也不起作用。我更新了Windows.Azure.Storage:仍然不起作用。
问题是:Visual Studio给出了一个错误,插入到IndexWriter中的azureDirectory需要是Directory类型,而不是AzureDirectory。但是,当我将其类型更改为Directory时,它说AzureDirectory不是Directory的子类型。
为什么所有互联网上的示例都是错误的,当我字面上复制粘贴它们时却不起作用?
更新:问题已解决,我写了一篇关于此的博客文章:http://leoncullens.nl/post/2012/11/18/Full-Text-Search-on-Azure-with-LuceneNET.aspx
3个回答

2
我已经“forked”了这个项目,将Lucene参考更新为3.0.3,并将Azure存储客户端更新为2.0(与v1.8 SDK一起发布的版本),并将代码放在这里:

https://github.com/richorama/AzureDirectory

“复制“TestApp”中的示例代码应该相对简单,以便了解如何使用此版本的Lucene.NET。”
“免责声明:我不是Lucene专家,也没有进行适当的测试——请自行承担风险!”

谢谢Richard!我会在两天左右研究一下这个,如果有效的话我会告诉你 :) - Leon Cullens
好的,经过长时间的努力,看起来我终于搞定了! :-) 我不得不进行很多实验,但是我认为如果我再微调一下,它就会表现得很好。非常感谢你的帮助! - Leon Cullens
很棒,写一篇博客文章会对其他人有所帮助,让他们知道如何做到这一点! - Richard Astbury
1
这是博客文章的链接http://leoncullens.nl/post/2012/11/18/Full-Text-Search-on-Azure-with-LuceneNET.aspx。希望里面没有太多错误 :) - Leon Cullens
我没有尝试过这个,但原始的AzureDirectory实现根本不适合生产环境。我不确定仅仅替换StorageClient是否足够。如果你尝试使用需要对AzureDirectory代码进行一些重大更改的库编译Lucene 3.0.3(源代码),我已经在Azure IaaS上使一切正常,没有问题。 - Bart Czernicki
在实现中有什么不足之处?我没有花太多时间查看代码,只是修复了错误的引用。 - Richard Astbury

0
几个月前,我使用 LUCENE 2.9 版本和旧版 Azure SDK 进行编程时,这个设置对我起作用。工作和不工作的主要区别在于不使用 RAMDirectory,因为最终它会耗尽内存。在不使用 RAMDirectory 的情况下,我成功地索引了 25 GB 的数据。
_azureDirectory  = new AzureDirectory
    ( storageAccount 
    , catalogName
    //, new RAMDirectory());

_version = Lucene.Net.Util.Version.LUCENE_29;

_analyzer = new StandardAnalyzer(_version);


IndexWriter
writer = new IndexWriter(
                  _azureDirectory, 
                  _analyzer,
                  newIndex, // new index or update
                  IndexWriter.MaxFieldLength.UNLIMITED);

writer.SetUseCompoundFile(false);
writer.SetRAMBufferSizeMB(800);
writer.SetMergeFactor(10);

它是名为“create”的参数。 true - 创建索引或覆盖现有索引; false - 追加到现有索引 - hocho

0

我想我已经看到过你的帖子了。听起来需要做很多工作。难道不能通过使用不同的全文搜索引擎或另一个库(如SimpleLucene)更轻松地完成吗? - Leon Cullens
SimpleLucene不是Lucene Directory类的实现。AzureDirectory是一个在Azure Blob存储上工作的抽象层。SimpleLucene只是采用Lucene代码并试图使其“更易于使用”。Lucene 3.0.3刚刚发布..它在VM上的本地文件系统(Directory对象)上运行得非常好。您对Azure IaaS有多熟悉?创建Azure VM相当简单。关于您的评论,您可以购买Lucene即服务:http://www.lucidworks.com/products/lucidworks-search/lucidworks-search-windows-azure - Bart Czernicki
我对IaaS毫无经验,所以我宁愿不自己管理Windows服务器和那种东西,我更喜欢纯粹专注于构建的软件。我担心托管的Lucene.NET也不是一个选项,我至少需要中型计划,这将花费我500美元/月。 - Leon Cullens
1
那么,您不想使用Lucene 3.0.3与AzureDirectory...它可能在样本/示例中工作。如果您获取Lucene 3.0.3的源代码并尝试针对AzureDirectory的源代码进行编译,则会出现各种问题。这让我非常害怕...听起来您“想要专注于”软件,因此使用较旧版本的Lucene可能是最佳选择(我上面发布的第二个链接可能有效)。 - Bart Czernicki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接