我刚刚开始学习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));
但我如何迭代结果?
答案 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();
}