从Lucene索引中的字段获取所有单词
像这样的问题已经被问了很多次(例如,,…),而我无法从这些答案中得到我所需要的可能只是我不理解Lucene所说的“术语”或“术语文档”的意思 我建立了一个Lucene索引,因此:从Lucene索引中的字段获取所有单词,lucene,lucene.net,Lucene,Lucene.net,像这样的问题已经被问了很多次(例如,,…),而我无法从这些答案中得到我所需要的可能只是我不理解Lucene所说的“术语”或“术语文档”的意思 我建立了一个Lucene索引,因此: var db = new DataClassesDataContext(); var articles = (from article in db.Articles orderby article.articleID ascending select ar
var db = new DataClassesDataContext();
var articles = (from article in db.Articles
orderby article.articleID ascending
select article).ToList();
var analyzer = new StandardAnalyzer(Version.LUCENE_30);
using (var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED))
{
foreach (var article in articles)
{
var luceneDocument = new Document();
luceneDocument.Add(new Field("ArticleID", article.articleID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
luceneDocument.Add(new Field("Title", article.title, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
luceneDocument.Add(new Field("Paragraph", article.paragraph, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
writer.AddDocument(luceneDocument);
}
Console.WriteLine("Optimizing index.");
writer.Optimize();
}
这工作得很好,我可以检索任何术语频率向量。比如说
var titleVector = indexReader.GetTermFreqVector(5001, "Title");
给出结果{Title:do/1,healthcare/1,right/1}
。但我想列举一个倒排索引,它将单词(如“doing”、“healthcare”和“right”)映射到文档的id,文档的标题包含每个单词。我想构建一个CSV文件,其中每一行类似于word、ArticleID\u 1、ArticleID\u 2,ArticleID\u n
到目前为止,我所拥有的一切都不起作用(它吐出了所有的术语):
如何从文档中的“标题”字段中获取索引用作术语的所有单词的列表?也就是说,我如何将最后一个代码片段仅限于标题字段术语?典型的情况是,我一写下问题就给出了答案
var terms = indexReader.Terms();
while (terms.Next())
{
if (terms.Term.Field == "Title")
{
var row = "\"" + terms.Term.Text + "\", ";
var termDocs = indexReader.TermDocs(terms.Term);
while (termDocs.Next())
{
row += indexReader[termDocs.Doc].Get("ArticleID") + ", ";
}
row.TrimEnd(new char[] { ',', ' ' });
titleFile.WriteLine(row);
}
}
请注意,Lucene文档ID不是持久性的,可以/将在索引运行之间更改。如果您需要保持一致的引用ID,则需要将其提供给Lucene,并在索引发展过程中对其进行维护。谢谢@M.Babcock,我正在将ArticleID作为文档字段传递,因此我将使用该字段。嗯,对于大型索引来说,这将非常缓慢。当您使用indexreader加载文档时,您正在从磁盘读取数据。如果有一种方法可以在不需要加载文档或从磁盘读取的情况下获取当前值,那就太好了。
var terms = indexReader.Terms();
while (terms.Next())
{
if (terms.Term.Field == "Title")
{
var row = "\"" + terms.Term.Text + "\", ";
var termDocs = indexReader.TermDocs(terms.Term);
while (termDocs.Next())
{
row += indexReader[termDocs.Doc].Get("ArticleID") + ", ";
}
row.TrimEnd(new char[] { ',', ' ' });
titleFile.WriteLine(row);
}
}