如何在solr中按计数排序组

时间:2013-07-03 20:48:49

标签: solr

我想知道如何在Solr结果中订购组。我想按numFound订购这些小组。我看到了如何按分数 here 订购这些群组,但这似乎并没有真正对我看到的示例产生影响,而且并不完全是什么我想了。

在xml中,您可以看到每个组的数量为numFound,这就是我想要对组进行排序的情况,例如,我可以在顶部看到最大的组。

<arr name="groups">
<lst>
<str name="groupValue">top secret</str>
<result name="doclist" numFound="12" start="0">
...

任何提示赞赏!谢谢!

4 个答案:

答案 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;你可以在这里申请你的领域。

希望它有所帮助。