Lucene 多值字段 - 将 TextField 与 StringField 混合

Mar*_*cki 3 java lucene indexing

我使用一个多值字段查询我的索引。在索引过程中,该字段是使用几个字段创建的,其中一些是TextField,一些是StringField

我遇到的问题是,通过使用带有多个单词的查询来查询索引,我得到了: java.lang.IllegalStateException: field "someField" was indexed withoutposition data; 无法运行 PhraseQuery(term=someTerm)

我更改了多值字段的创建方式,仅使用TextField,问题就消失了。

看来TextFieldStringField不应该混合在一个多值字段中。我对吗?有人能给我一些解释为什么(或为什么不)吗?

fem*_*gon 5

StringField 被显式设置为仅存储文档 ( IndexOptions.DOCS_ONLY ),这会忽略存储的频率和位置。由于它实际上是一个关键字字段,并且多个单词将存储为单个标记,因此针对它运行短语查询实际上没有意义。

虽然当然可以将不同的字段类型混合到同一字段中,但这似乎会给我带来混乱和不可预测的结果。我建议对添加到特定字段的类型保持一致,如果您需要添加具有显着不同的管理逻辑的值,例如 TextField 与 StringField 之间的差异,那么将它们放置在不同的字段中可能是一个更好的主意在索引中。

如果这种情况发生在某种包罗万象的便利字段(例如此 SOLR 示例text中的字段)中,那么对任何内容使用 TextField 可能是一个合理的想法。