Lucene,StringField在检索并再次存储doc时会被标记化吗?

时间:2016-04-04 12:09:00

标签: lucene

背景

我只需将一个文档添加到索引并关闭它(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()的值,我会得到:

  • 存储,索引,omitNorms,indexOptions = DOCS
  • 存储,索引,的标记化下,omitNorms,indexOptions = DOCS

编辑2 我总结说这是一个错误。错误报告已提交:https://issues.apache.org/jira/browse/LUCENE-7171

0 个答案:

没有答案