【问题标题】:When to use custom fields in Lucene何时在 Lucene 中使用自定义字段
【发布时间】:2017-03-27 16:11:26
【问题描述】:

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

【问题讨论】:

  • 你用的是哪个版本的lucene?
  • @PhilippLudwig 6.5.0

标签: java indexing lucene


【解决方案1】:

文本字段和字符串字段

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

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多