根据数字字段在Lucene中对搜索结果进行排序


问题内容

我有一些文档有两个字段:文本,计数。

我曾经Lucene为文档编制索引,现在我想在文本中搜索并按降序将结果按计数排序。我怎样才能做到这一点?


问题答案:

Apache Lucene的默认搜索实现返回按分数(最相关的结果排在最前),然后按ID(最旧的结果排在前)的结果。

可以在查询时使用附加的Sort参数自定义此行为。

TopFieldDocs Searcher#search(查询查询,过滤器过滤器,int n,排序排序)

Sort参数指定用于排序的字段或属性。默认实现是通过以下方式定义的:

new Sort(new SortField[] { SortField.FIELD_SCORE, SortField.FIELD_DOC });

要更改排序,只需将字段替换为所需的字段即可:

new Sort(new SortField[] {
SortField.FIELD_SCORE,
new SortField("field_1", SortField.STRING),
new SortField("field_2", SortField.STRING) });

这听起来很简单,但要满足以下条件才能起作用:

  • 您必须指定SortField(String field,int type)的type参数,以使Lucene找到您的字段,即使这通常是可选的。
  • 排序字段必须建立索引,但不能标记化:

document.add (new Field ("byNumber", Integer.toString(x), Field.Store.NO, Field.Index.NOT_ANALYZED));

  • 排序字段的内容只能是纯文本。如果仅一个元素在用于排序的字段之一中具有特殊字符或重音,则整个搜索将返回未排序的结果。

检查本教程