我只需将一个文档添加到索引并关闭它(Lucene 5.5.0):
Directory index = new RAMDirectory();
IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
IndexWriter w = new IndexWriter(index, config);
Document doc = new Document();
doc.add(new StringField("isbn", "9900333X", Field.Store.YES));
doc.add(new TextField("title", "The Art of Computer Science", Field.Store.YES));
w.addDocument(doc);
w.commit();
w.close();
isbn
已存储且未标记化(StringField
)title
已存储并标记化(TextField
)我可以通过isbn检索此文档,其中包含:
IndexSearcher searcher = new IndexSearcher(DirctoryReader.open(index));
Query q = new TermQuery(new Term("isbn","9900333X"));
TopDocs td = searcher.search(q, 1);
现在,这可行,因为isbn
未被标记化/分析。
让我们采用我们刚刚找到的相同文档并将其存储到新索引中:
Directory index2 = new RAMDirectory();
IndexWriterConfig config2 = new IndexWriterConfig(new StandardAnalyzer());
IndexWriter w2 = new IndexWriter(index2, config2);
Document d2 = searcher.doc(td.scoreDocs[0]);
w2.addDocument(d2);
w2.commit();
w2.close();
现在我重新打开这个索引并搜索相同的isbn:
IndexSearcher searcher2 = new IndexSearcher(DirctoryReader.open(index2));
TopDocs td2 = searcher2.search(q, 1);
这不会找到它。
然而,当isbn仅由数字组成时,同样的示例可以正常工作。这使我假设它在存储时被标记化,即使它应该是StringField
。实际上,如果我使用KeywordAnalizer
作为作者,而不是StandardTokenizer
,那么它再次起作用。但这不是我想要的,因为那时title
字段也不会被分析。此外,如果这是问题,第一次检索不应该有效
看起来将文档存储到第二个索引中会丢弃其中的一些字段'属性。这是预期的吗? 除非我做错了什么,否则这对我来说就像是一个错误。该字段已创建为未标记化。无论文档存储在哪里,它都应该保持不变。
修改
如果我在第一个和第二个索引中打印fieldType()
的值,我会得到:
编辑2 我总结说这是一个错误。错误报告已提交:https://issues.apache.org/jira/browse/LUCENE-7171