索引字段使用:new TextField(String fieldName,Reader reader)

时间:2016-03-21 14:16:04

标签: lucene

我一直在尝试使用Lucene在Fields中提供的readerValue()索引字段。问题是这些条款没有被编入索引。这是代码中有趣的部分:

IndexWriterConfig config = new IndexWriterConfig(new SimpleAnalyzer());
IndexWriter indexWriter = new IndexWriter(directory, config);
indexWriter.deleteAll();
String str = "Some random text to be indexed";
Reader reader = new StringReader(str);
Document doc = new Document();
doc.add(new TextField("content", reader));          
indexWriter.addDocument(doc);

现在,如果我将该文本作为String与另一个TextField构造函数索引它可以正常工作,但是像这样它不会索引这些术语,而是在我尝试获取搜索后的字段值时返回null: / p>

QueryParser queryParser = new QueryParser("content",  new SimpleAnalyzer());  
Query query = queryParser.parse(text);
TopDocs topDocs = indexSearcher.search(query,10);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {           
     Document document = indexSearcher.doc(scoreDoc.doc);
     Reader r = document.getField("content").readerValue();

我真的看不出问题,也许这是我错过的一些愚蠢的事情,或者我使用它错了?提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

默认情况下,TextField未存储。您正在看到的行为是未存储的字段。您应该能够搜索它,但不能从索引中检索它。为字段内容获取字符串参数的构造函数允许您设置是否存储字段,从而设置不同的行为。

商店选项在该构造函数上不可用的原因是Lucene明确禁止使用ReaderTokenStream值设置存储的字段。如果您想存储该字段,您只需要自己从Reader获取字符串值。