基于数字字段在Lucene中对搜索结果进行排序

时间:2014-02-23 08:10:39

标签: java lucene

我有一些文档有两个字段:text,count。 我使用lucene索引文档,我现在想要在文本中搜索并按降序排序按结果排序。我怎么能这样做?

3 个答案:

答案 0 :(得分:12)

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字段,int 使Lucene找到你的领域,即使这是正常的 可选的。
  • 排序字段必须编入索引但不能标记化:

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

  • 排序字段内容必须仅为纯文本。如果只有一个 element在所使用的某个字段中具有特殊字符或重音 对于排序,整个搜索将返回未排序的结果。

选中tutorial

答案 1 :(得分:4)

下面的线就可以了。最后一个参数为boolean reverse如果您将其设置为true,它将按相反的顺序排序,即在您的情况下降序。

  SortField longSort = new SortedNumericSortField(FIELD_NAME_LONG, SortField.Type.LONG, true);

示例代码:

  IndexSearcher searcher = new IndexSearcher(reader);
  Query q = new MultiFieldQueryParser(new String[] { FIELD_NAME_NAME}, analyzer).parse("YOUR_QUERY") );

  SortField longSort = new SortedNumericSortField(FIELD_NAME_LONG, SortField.Type.LONG, true);

  Sort sort = new Sort(longSort);
  ScoreDoc[] hits = searcher.search(q, 10 , sort).scoreDocs;

您还需要在创建索引时将启用排序的字段添加为NumericDocValuesField

 doc.add(new NumericDocValuesField(FIELD_NAME_LONG, longValue));//sort enabled field

代码符合lucene-core-5.0.0

答案 2 :(得分:1)

第一

Fieldable count = new NumericField("count", Store.YES, true);

第二

SortField field = new SortField("count", SortField.INT);
Sort sort = new Sort(field);

第三

TopFieldDocs docs = searcher.search(query, 20, sort);
ScoreDoc[] sds = docs.scoreDocs;

喜欢这样就行了!