我正在使用Lucene构建一个用于构建特定于域的数据的搜索引擎。 Lucene显然功能强大且可定制。最初我创建了自己的字段类型并且正在使用那些,但后来我得到了0次点击所以我读了this并发现我应该使用文本字段。我的一个字段是日期,另一个是低基数类别。我查看了Field
的设置者,但无法弄清楚StringField
和TextField
隐含的内容以及我应该如何看待它们。我应该为非严格的文本字段使用自定义字段类型吗?
答案 0 :(得分:1)
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
。