何时在Lucene中使用自定义字段

时间:2017-03-27 16:11:26

标签: java indexing lucene

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

1 个答案:

答案 0 :(得分:1)

TextField和StringField

TextFieldStringField之间的差异隐藏在班级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,我们可以看到除了FieldStringFieldTextField类型之外,lucene主要提供数字“点数”。点的作用就像字段一样,它们被索引,但没有存储(请参阅上面的StoredField)。

对于您的约会对象,我建议使用LongPoint来存储时间戳,例如:

document.add(new LongPoint("date", someCalendar.getTimeInMillis() / 1000));

稍后使用某个点可以使用LongPoint.newRangeQuery执行范围查询,该查询可用于在给定时间范围内检索文档,或作为附加过滤器应用于现有查询。

关于你的“低基数类别”,我不确定你的意思,但如果它是一个数字,你可以使用IntPoint