我想知道如何在Solr结果中订购组。我想按numFound
订购这些小组。我看到了如何按分数 here 订购这些群组,但这似乎并没有真正对我看到的示例产生影响,而且并不完全是什么我想了。
在xml中,您可以看到每个组的数量为numFound
,这就是我想要对组进行排序的情况,例如,我可以在顶部看到最大的组。
<arr name="groups">
<lst>
<str name="groupValue">top secret</str>
<result name="doclist" numFound="12" start="0">
...
任何提示赞赏!谢谢!
答案 0 :(得分:1)
这是一个老问题,但两个查询可以 。
首次查询:将您要分组的字段作为导航状态的一组方面进行分组。您可以在此处将返回的记录数限制为0:您只需要facet。您返回的构面数应该是页面的大小。
group_id:
23 (6)
143:(3)
5:(2)
第二个查询:应该是记录,因此不需要任何方面。查询应该是对第一个查询返回的构面字段值的OR查询。 (group_id:23 OR group_id:143 OR group_id:5等等)并按您用于分组的ID进行分组。
排序:重新排序查询2中的记录以匹配查询1中的顺序。
我会这样做,条件是我不确定OR查询的可扩展性如何。如果您正在寻找分页,请记住您可以偏移分面:将其用作机制而不是取消记录。
答案 1 :(得分:0)
自上次调查此内容以来,这是不可能的。
答案 2 :(得分:0)
无法对numFound进行排序,因为numFound不是Solr中的字段 检查discussion提到它不受支持,我也没有找到JIRA问题。
答案 3 :(得分:0)
您可以使用字段
进行排序考虑一个例子:
如果你有5个FACETS和COUNT相关联。 然后,您可以使用每个字段的COUNTS进行排序。
它适用于普通/非分面领域。
public class FacetBean implements Category,Serializable {
private String facetName; //getter , setters
private long facetCount; // getter , setters
public FacetBean(String facetName, long count,) {
this.facetName = facetName;
this.count = count;
}}
你的通话方法应该是这样的
private List<FacetBean> getFacetFieldsbyCount(QueryResponse queryResponse)
{
List<FacetField> flds = queryResponse.getFacetFields();
List<FacetBean> facetList = new ArrayList<FacetBean>();
FacetBean facet = null;
if (flds != null) {
for (FacetField fld : flds) {
facet = new FacetBean();
facet.setFacetName(fld.getName());
List<Count> counts = fld.getValues();
if (counts != null) {
for (Count count : counts) {
facet.setFacetCount(count.getCount());
}
}
facetList.add(facet);
}
}
Collections.sort(facetList,new Comparator<FacetBean>() {
public int compare(FacetBean obj1, FacetBean obj2) {
if(obj1.getFacetCount() > obj2.getFacetCount()) {
return (int)obj1.getFacetCount();
} else {
return (int)obj2.getFacetCount();
}
}
});
return facetList;
}
在同一个URL中,他们提到了类似的内容。
sort - &gt;例如: sort = popular desc 会导致根据最受欢迎的文档对组进行排序
group.sort - &gt;你可以在这里申请你的领域。
希望它有所帮助。