文本字段和字符串字段
TextField 和 StringField 之间的区别隐藏在 FieldType 类中。 FieldType 允许您使用自定义属性定义字段,如下所示:
FieldType type = new FieldType();
type.setTokenized(true);
type.setStoreTermVectors(true);
...
document.add(new Field("fieldName", someString, type));
因此,这两个类都从Field 扩展并设置了不同的字段类型。这变得更加混乱,因为字段类型根据字段是否存储而有所不同。 (来源:Lucene 6.5源码)
什么时候用什么
简而言之:
- 使用
StringField 获取 ID、URL 等信息,这些信息不需要某些分析器进行任何标记、词干提取或其他处理。
- 使用
TextField 获取需要此处理的信息,例如文档的标题或内容。
- 对于必须存储在索引中的任何其他内容,请使用
StoredField。
数字字段
查看documentation,我们可以看到除了Field、StringField 和TextField 类型之外,lucene 主要提供数字“点”。点的工作方式类似于字段,因为它们被索引但不被存储(参见上面的StoredField)。
对于您的日期,我建议使用LongPoint 来存储时间戳,例如:
document.add(new LongPoint("date", someCalendar.getTimeInMillis() / 1000));
稍后使用点将允许您使用LongPoint.newRangeQuery 执行范围查询,可用于在给定时间范围内检索文档,或将其用作现有查询的附加过滤器。
关于您的“低基数类别”,我不确定您的意思,但如果它是一个数字,您可以使用IntPoint。