创建一个“双层”'在solr中排序顺序

时间:2016-03-02 21:49:31

标签: sorting solr solrj

我正在使用solr,并且遇到了一个我无法克服的有趣的排序请求。

请求是针对单个索引字段的单个搜索短语,结果按照以“'开头”的项目排序。首先是搜索短语,然后结果的其余部分按字母顺序排序。

例如,给定包含['reversion catapult', 'rat', 'catering', 'mat', 'cat', 'volkswagen', 'recatogorize', 'a total catastrophe']的solr索引,搜索短语“cat'应按以下顺序返回结果:

cat, catering, a total catastrophe, recatogorize, reversion catapult

使用查询提升功能,我已经能够获得需求的第一部分,其中'以'开头。匹配位于列表的顶部,但我无法按字母顺序排列其余项目。

这是我当前的q语句(使用solrJ):

((entity_name_search:" + "\"" + URLEncoder.encode(descSearchString, CharacterEncoding.UTF_8)
                    + "*^2\") OR (entity_name_search:"
                    + "\"" + URLEncoder.encode(descSearchString, CharacterEncoding.UTF_8) + "\"))

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

不是根据分数进行排序,而是根据特定字段进行排序。

Solr固有地根据字段值的词汇顺序对结果进行排序。因此,简单的&sort=field asc就足够了。

当然,首先返回的结果将在很大程度上取决于您如何为您的字段和您的搜索方式编制索引,即您使用的是哪种分析工具在索引和查询时使用,您使用的查询解析器以及您应用的搜索规则。

答案 1 :(得分:0)

使用强力方法,返回并迭代以字母顺序(如Binoy的帖子中所述)对索引排序字段的查询结果。创建了两个JSON对象,其中一个包含“以搜索词开头”的所有结果,第二个包含所有其他结果。结果看起来像这样:

    JSONArray priorityOneJSON = new JSONArray();
    JSONArray priorityTwoJSON = new JSONArray();

    for (int i = 0; i < completeJSON.length(); i++) {
        JSONObject jobj = completeJSON.getJSONObject(i);
        String name = jobj.getString(parameters.get(FIELD_TO_SORT_KEY));
        if (name.toUpperCase().startsWith(parameters.get(FIELD_KEY))) {
            priorityOneJSON.put(jobj);
        } else {
            priorityTwoJSON.put(jobj);
        }
    }

    JSONArray result = new JSONArray();
    for (int i = 0; i < priorityOneJSON.length(); i++) {
        result.put(priorityOneJSON.get(i));
    }
    for (int i = 0; i < priorityTwoJSON.length(); i++) {
        result.put(priorityTwoJSON.get(i));
    }
    tempJSON.put(parameters.get(OBJ_TO_SORT_KEY), result);
    jsonObject.put(parameters.get(MAIN_OBJ_KEY), tempJSON);
    LOGGER.log(Level.FINE, "Final JSON: " + jsonObject);
    return jsonObject;

在上面的代码中,completeJSON是SOLR查询的JSON结果。我们迭代该数组并拉出我们关心的字段。然后我们执行'startsWith'操作来确定这个结果是应该在第一个排序集还是第二个排序集中,并相应地放置它。

然后我们取两个数组,基本上把它们塞进另一个数组。整个解决方案似乎是集中处理的方式,但是在我们很短的时间内可以做到最好。