在 solr 中创建 'two - tiered' 排序顺序

Create a 'two - tiered' sort order in solr

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

请求是针对单个索引字段的单个搜索词组,结果按 'start with' 搜索词组排在第一位的项目排序,然后其余结果按字母顺序排序。

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

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

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

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

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

如有任何帮助,我们将不胜感激。

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

Solr 固有地根据字段中值的词法顺序对结果进行排序。所以一个简单的 &sort=field asc 就足够了。

当然,首先返回什么结果将在很大程度上取决于您如何为您的领域的术语建立索引以及您如何搜索,即,您在索引和搜索时使用了哪种分析器查询时间、您使用的查询解析器以及您应用的搜索规则。

使用强力方法,返回并迭代查询的结果(如 Binoy 的 Post 中所述)按字母顺序对字段进行排序。创建了两个 JSON 对象,一个对象包含 'start with' 搜索词的所有结果,第二个对象包含所有其他对象。结果看起来像这样:

    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' 操作来确定这个结果应该在第一个排序集中还是在第二个排序集中,并相应地放置它。

然后我们将这两个数组放入另一个数组中。整个解决方案似乎是处理密集型的方式,但却是我们在非常短的时间内可以完成的最佳解决方案。