DynamicField 上的 Solr 聚合/方面

Solr Aggregation / Facet on DynamicField

Table 架构:

CREATE TABLE attributes_v1 (
  profile_id bigint,
  attributes map<text, int>,
  solr_query text,
  PRIMARY KEY ((profile_id))
)

table 中的数据如下所示:

profile_id | attributes                                  
------------+---------------------------------------------
          2 | {'a101': 1, 'a11': 1, 'a12322': 1, 'a51': 3}
          3 |      {'a1': 1, 'a10': 1, 'a11': 3, 'a51': 1}
          1 |     {'a1': 1, 'a10': 1, 'a2322': 1, 'a5': 3}

我不知道如何完成以下操作(通过 CQL 或 java 使用 solr)

所需的聚合/方面:

a1 计数:2 a1总和:2

a101 计数:1 a101 总和:1

a11 计数:2 a11 总和:4

a12322 计数:1 a12322 总和:1

a2322 计数:1 a2322 总和:1

a10 计数:2 a10 总和:2

a51 计数:2 a51 总和:4

a5 计数:1 a5 总和:3

有什么想法吗?

谢谢!

我相信您应该在地图键前面加上字段本身的名称。这是以下链接中提到的 requirement/limitation:

link1

link2

link3

因此,例如,您的 'a1' 元素应称为 'attributes1',而您的 'a12322' 应称为 'attributes12322'。

然后在您的 Solr 模式中,定义一个 dynamicField 如下:

<dynamicField name="attributes*" ... />

然后您可以通过直接引用地图元素来查询它们。例如

q=attributes12322:1

现在,对于你关于聚合的问题,因为除了计数之外你还需要总和,我认为你需要使用 stats 而不是 facet

stats=true&stats.field=attributes12322

您可以指定多个 stats.field 参数,例如:

stats=true&stats.field=attributes12322&stats.field=attributes1&stats.field=attribute51

然后您可以从每个 stats_fields 响应项的 'sum' 属性和 'count' 属性中检索总和以及计数

编辑:

我没有立即注意到您特别要求通过 CQL 或 Java 查询 Solr。我不确定 CQL Solr queries

是否支持 'stats'