【问题标题】:Create a 'two - tiered' sort order in solr在 solr 中创建“两层”排序顺序
【发布时间】:2016-03-02 21:49:30
【问题描述】:

我正在使用 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) + "\"))

任何帮助将不胜感激。

【问题讨论】:

  • 我有一个强力解决方案来解决这个问题,如果有人来找它,我会发布它

标签: sorting solr solrj


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢 Binoy,但这仅涉及数据的主要排序。我的帖子要求对返回的数据执行两个不同的排序操作。第一个是首先显示所有以“开头”搜索短语的术语。第二个是匹配但不以搜索短语开头的其余术语接下来按字母顺序排序。类似于 SQL 中的 UNION 语句。
【解决方案2】:

使用蛮力方法,根据索引按字母顺序(如 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”操作来确定这个结果应该在第一个排序集中还是第二个排序集中,并相应地放置它。

然后我们把这两个阵列基本上塞进另一个阵列。整个解决方案似乎是处理密集型的方式,但却是我们在很短的时间内可以完成的最好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多