我一直在尝试使用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();
我真的看不出问题,也许这是我错过的一些愚蠢的事情,或者我使用它错了?提前感谢您的帮助。
答案 0 :(得分:2)
默认情况下,TextField
未存储。您正在看到的行为是未存储的字段。您应该能够搜索它,但不能从索引中检索它。为字段内容获取字符串参数的构造函数允许您设置是否存储字段,从而设置不同的行为。
商店选项在该构造函数上不可用的原因是Lucene明确禁止使用Reader
或TokenStream
值设置存储的字段。如果您想存储该字段,您只需要自己从Reader
获取字符串值。