C# 从lucene获取特定字段值

C# 从lucene获取特定字段值,c#,lucene,lucene.net,C#,Lucene,Lucene.net,我刚开始学习lucene是如何工作的,我正试图在我用mysql编写的allready网站上实现它 我的文档中有一个名为city的字段,我想从文档中获取city的所有值 我发现这个问题正是我所需要的 但它们显示的只是一行代码,正如我所说的,我没有足够的经验来理解如何实现这一点 有人能帮我写一些代码来实现IndexReader.Opendirectory,true.Termsnew Termcity,String.Empty 在该声明之前/之后是什么 我试过这个: System.IO.Directo

我刚开始学习lucene是如何工作的,我正试图在我用mysql编写的allready网站上实现它

我的文档中有一个名为city的字段,我想从文档中获取city的所有值

我发现这个问题正是我所需要的 但它们显示的只是一行代码,正如我所说的,我没有足够的经验来理解如何实现这一点

有人能帮我写一些代码来实现IndexReader.Opendirectory,true.Termsnew Termcity,String.Empty

在该声明之前/之后是什么

我试过这个:

System.IO.DirectoryInfo directoryPath = new System.IO.DirectoryInfo(Server.MapPath("LuceneIndex"));
    Directory directory = FSDirectory.Open(directoryPath);
    Lucene.Net.Index.TermEnum iReader = IndexReader.Open(directory,true).Terms(new Term("city", String.Empty));

但是如何迭代结果呢?

我不熟悉C API,但它看起来非常类似于Java API

这段代码的作用是获取一个具有只读访问权限的IndexReader实例,该实例用于从存储在目录中的Lucene索引段读取数据。然后,它从给定的一个项开始,得到所有项的枚举。在Lucene中存储术语的字典索引部分是由.tis文件组织的,首先按字段名,然后按术语文本按字典顺序排列

因此,这条语句为您提供了所有术语文本的枚举,从字段city的开头开始。此外:在Java中,您更愿意编写新的术语city。您现在需要找到这个枚举的C API,然后遍历它,直到您得到一个与字段不同的术语


最后一点注意:通常,您应该避免这样做:例如,这可能会限制您分发索引的能力。如果事实证明这是您在使用Lucene的一开始就在做的事情,那么很可能您使用它更像是一个文档数据库,而不是一个搜索库。

此循环应该迭代所有术语:

Term curTerm = iReader.Term();
bool hasNext = true;
while (curTerm != null && hasNext)
{
    //do whatever you need with the current term....
    hasNext = iReader.Next();
    curTerm = iReader.Term();
}

基本上,我将它用作文档数据库,因为它比我尝试的任何其他数据库都快得多。我用lucene构建了一个电话簿,在某个时候我只需要显示城市,这就是我为什么要走这条路。即使这看起来很合乎逻辑,它也陷入了一个无限循环。但是你不需要检查你的迭代是否正在进入另一个领域吗?只是好奇:也许在lucene.net中它是不同的。那么你为什么把它标记为已接受呢?你解决了无限循环问题吗?@L.B谢谢,更正了代码。虽然是从一些官方文档中获取的,但还是有点惊讶为什么它缺少如此重要的部分……不过,我认为您需要检查curTerm.Field!=城市:请参阅此代码