【发布时间】:2014-03-24 19:37:56
【问题描述】:
我有一些包含两个字段的文档:文本、计数。
我使用Lucene 来索引文档,现在我想在文本中搜索并获得按计数降序排序的结果。我该怎么做?
【问题讨论】:
我有一些包含两个字段的文档:文本、计数。
我使用Lucene 来索引文档,现在我想在文本中搜索并获得按计数降序排序的结果。我该怎么做?
【问题讨论】:
Apache Lucene 的默认搜索实现返回按分数排序的结果(最相关的结果在前),然后按 id 排序(最旧的结果在前)。
可以在查询时使用附加的排序参数自定义此行为。
TopFieldDocs Searcher#search(Query query, Filter filter, int n, Sort sort)
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) });
这听起来很简单,但在满足以下条件之前不会起作用:
排序字段必须被索引但不能被标记:
document.add (new Field ("byNumber", Integer.toString(x), Field.Store.NO, Field.Index.NOT_ANALYZED));
排序字段内容只能是纯文本。如果只有一个 元素在使用的字段之一中具有特殊字符或重音 对于排序,整个搜索将返回未排序的结果。
检查这个tutorial。
【讨论】:
sort order
SortField.Type中,所以对于String它是SortField.Type.STRING
第一:
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;
这样就好了!
【讨论】:
下面的行就可以了。最后一个参数是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
【讨论】: