基于数字字段在Lucene中对搜索结果进行排序
我有一些文档有两个字段:text,count。 我使用lucene索引文档,我现在想要在文本中搜索并按降序排序得到结果。 我怎样才能做到这一点?
Apache Lucene的默认搜索实现返回按分数排序的结果(首先是最相关的结果),然后是id(最早的结果)。
可以在查询时使用附加的Sort参数自定义此行为。
TopFieldDocs Searcher #search(查询查询,filterfilter,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找到您的字段,即使这是normaly可选的。
-
排序字段必须编入索引但不能标记化:
document.add (new Field ("byNumber", Integer.toString(x), Field.Store.NO, Field.Index.NOT_ANALYZED));
-
排序字段内容必须仅为纯文本。 如果只有一个元素在用于排序的字段之一中具有特殊字符或重音,则整个搜索将返回未排序的结果。
查看本教程 。
下面的线就可以了。 如果将其设置为true,则最后一个参数为boolean reverse
,它将按相反的顺序排序,即在您的情况下降序。
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
第一:
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;
这样可以!