按子文档集合中的值对 solr 响应进行排序

Sort solr response by value in subdocument collection

我正在使用 DSE solr 为包含 UDT 集合的 cassandra table 建立索引。我希望能够根据这些 UDT 中的值对搜索结果进行排序。

给出一个简单的例子table...

create type test_score (
  test_name text,
  percentile double,
  score int,
  description text
);

create table students (
  id int,
  name text,
  test_scores set<frozen<test_score>>,
  ...
);

...并假设我通过 dsetool 自动生成 solr 模式,我希望能够编写一个 solr 查询来查找已经参加测试的学生(通过特定 test_name), 并按该测试的分数(或百分位数,或其他)对它们进行排序。

好的,基本上你想在 table test_score 和学生之间做一个 JOIN 对吧?

根据官方文档:http://docs.datastax.com/en/datastax_enterprise/4.8/datastax_enterprise/srch/srchQueryJoin.html

只有当 2 table 共享相同的分区键时才能加入 Solr 核心,而在您的示例中不是这种情况...

很遗憾,您无法按 UDT 字段排序。

但是,我不确定这里的 UDT 值是多少。也许我对你的用例了解不够。我看到的另一个问题是每个分区键都是一个学生 ID,因此您只能为每个学生存储一个测试结果。更好的方法可能是使用测试 ID 作为聚类列,这样您就可以将一个学生的所有测试结果存储在一个分区中。像这样:

CREATE TABLE students (
id int,
student_name text,
test_name text,
score int,
percentile double,
description text,
PRIMARY KEY (id, student_name, test_name)
);

学生姓名有点多余(每个分区的每一行都应该相同),但不一定是聚类列。

然后您可以像这样对任何字段进行排序:

SELECT * 来自学生 WHERE solr_query='{"q":"test_name:Biology", "sort":"percentile desc"}' LIMIT 10;

我使用了此处描述的 JSON 语法:https://docs.datastax.com/en/datastax_enterprise/4.8/datastax_enterprise/srch/srchJSON.html