从lucene获取特定的字段值

时间:2011-10-16 10:23:03

标签: c# lucene lucene.net

我刚刚开始学习lucene是如何工作的,并且我试图在我已经用mysql编写的网站中实现它。

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

我找到了这个问题(这正是我需要的)Get all lucene values that have a certain fieldName 但他们只是表明有一行代码,正如我所说,我没有足够的经验来理解如何实现它。

有人可以帮我一些代码来实现IndexReader.Open(directory,true).Terms(new Term("city", 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));

但我如何迭代结果?

2 个答案:

答案 0 :(得分:0)

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

此代码的作用是获取具有只读访问权限的IndexReader实例,该实例用于从directory中存储的Lucene索引段中读取数据。然后它会从给定的一个开始获取所有术语的枚举。 Lucene中的词典(存储术语的索引部分)是有组织的.tis文件,按字典顺序按字段名称排序,然后按术语文本排序。

因此,此语句为您提供了所有术语文本的枚举,从字段city的开头开始(此外:在Java中,您更愿意编写new Term("city"))。您现在需要找到此枚举的C#API,然后逐步完成它,直到您获得与Term不同的field()

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

答案 1 :(得分:0)

此循环应迭代所有术语:

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();
}