Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 创建一个';两层';solr中的排序顺序_Sorting_Solr_Solrj - Fatal编程技术网

Sorting 创建一个';两层';solr中的排序顺序

Sorting 创建一个';两层';solr中的排序顺序,sorting,solr,solrj,Sorting,Solr,Solrj,我正在使用solr,遇到了一个有趣的排序请求,但我一直无法克服 请求是针对单个索引字段的单个搜索短语,首先按“以”搜索短语开头的项目对结果进行排序,然后按字母顺序对剩余结果进行排序 例如,如果solr索引包含['reversion catapult','rat','catering','mat','cat','volkswagen','recatogorize','a total Cancert'],则搜索短语'cat'应按以下顺序返回结果: cat, catering, a total cat

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

请求是针对单个索引字段的单个搜索短语,首先按“以”搜索短语开头的项目对结果进行排序,然后按字母顺序对剩余结果进行排序

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

cat, catering, a total catastrophe, recatogorize, reversion catapult
使用查询增强功能,我已经能够得到需求的第一部分,其中“start with”匹配项位于列表的顶部,但我无法得到其余项按字母顺序排序

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


任何帮助都将不胜感激。

不要根据分数排序,只需根据特定字段排序即可

Solr固有地根据字段中值的词法顺序对结果进行排序。因此,在您的情况下,一个简单的
&sort=field asc
就足够了


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

使用蛮力方法,根据索引按字母顺序对字段进行排序的查询结果(如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;
JSONArray priorityOneJSON=newjsonarray();
JSONArray prioritytworjson=新的JSONArray();
for(int i=0;i
在上面的代码中,
completeJSON
是SOLR查询的JSON结果。我们迭代该数组并提取我们关心的字段。然后,我们执行“startsWith”操作,以确定此结果应位于第一个排序集中还是第二个排序集中,并相应地放置它


然后我们将这两个数组放入另一个数组中。整个解决方案似乎是一种处理密集型解决方案,但这是我们在非常短的时间内所能做到的最好的解决方案。

谢谢你,Binoy,但这只解决了数据的主要排序问题。我的帖子要求对返回的数据执行两个不同的排序操作。首先,所有以搜索短语“开头”的术语都会首先显示。第二个是,匹配但不以搜索短语开头的其余术语将按字母顺序排序。类似于SQL中的UNION语句。对于这个问题,我有一个强力解决方案,如果有人来找我,我会发布它
    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;