Solr请求:SQL-like JOIN, GROUP BY, SUM(), WHERE SUM()

Solr request: SQL-like JOIN, GROUP BY, SUM(), WHERE SUM()

我是 Solr 新手,遇到以下问题:

我有那些文件:

类别:合同:

{
    "contract_id_s": "contract-ENG-00001",
    "title_s": "contract title",
    "ref_easy_s": "REFAAA",
    "commitment_id_s": "ENG-00001",
},

类别:承诺:

{
    "commitment_id_s": "ENG-00001",
    "title_s": "commitment title",
    "status_s": "Validated",
    "date_changed_status_s": "2015-09-30",
    "date_status_initiated_s": "2015-09-27",
    "date_status_confirmed_s": "2015-09-28",
    "date_status_validated_s": "2015-09-30",
},

类别:承诺和 sub_category_s:commitment_project:

{
    "id": "ENG-00001_AAA",
    "commitment_id_s": "ENG-00001",
    "project_id_s": "AAA",
    "project_name_s": "project name",
    "project_amount_asked_s": "2000",
    "project_amount_validated_s": "2100"
},
{
    "id": "ENG-00001_AAA2",
    "commitment_id_s": "ENG-00001",
    "project_id_s": "AAA",
    "project_name_s": "project name",
    "project_amount_asked_s": "1000",
    "project_amount_validated_s": "1200"
},

对于每个承诺,都可能有一个合同。 对于每个承诺,可能会有一些付款。

这是我想要做的: - 默认情况下,只有 select 承诺至少具有: .一个 sub_category_s:commitment_project 具有 project_amount_validated_s 值。 .一份合同。 - 如果按金额过滤,则此列表中只有 select,总和为 project_amount_validated_s > amount_min AND < amount_max.

的承诺

我不知道性能方面的最佳做法是什么? - 请求承诺的 ID,然后请求它们的详细信息? - 有没有办法加入这个请求中的合同信息? - 或者最好的做法是逐个请求每个文档?

问题是我不想请求无用的数据(性能、带宽)。

您可以使用以下形式的一些工具:

但是,我不确定您是否可以在一个查询中完成您希望的所有事情(与这些部分一起使用)。即使可以,将它们拼接在一起也比不上您希望复制的 SELECT...JOIN...GROUP BY...HAVING SQL 查询的简单性。 (除非你想尝试支持并行 SQL 的 Solr 6 developer snapshot


BUT 如果这是您唯一的用例,AND Solr 不是您的主要数据存储,我强烈建议您建模适合您用例的 Solr 数据。

例如从简单开始,非规范化,并且只包含搜索所需的数据模型中的字段:

  • 只有一种记录:commitment
  • 字段
    • commitment_id_s
    • title_s
    • status_s
    • date_changed_status_s
    • date_status_initiated_s
    • date_status_confirmed_s
    • date_status_validated_s
    • total_payments_asked(来自 DB 的 project_amount_asked 的数字总和)
    • total_payments_validated(来自 DB 的 project_amount_validated 的数字总和)
    • project_names(可搜索项目名称的多值列表)
    • contract_names(可搜索合约名称的多值列表)

那么您的查询只需要一个过滤器:

total_payments_validated:[<amount_min>TO<amount_max>]

强制执行您的默认标准。

一旦您的搜索确定了与 Solr 查询匹配的承诺 ID,然后返回并查询源数据库以获取显示所需的任何其他信息(项目详细信息、合同详细信息、日期等...)

好的,我找到了使用 !join 的解决方案。

例如,在PHP中:

[
    'q' => "{!join from=id to=service_id score=none}uri:\$serviceUri* AND -deleted:true",
    'fq' => "{!cache=false}category:monthly_volume AND type:\"$type\" AND timestamp:[$strDateStart TO $strDateEnd]",
    'alt' => 'json',
    'max-results' => 1000,
    'sort' => 'timestamp ASC',
    'statsFields' => 'stats.field=value&stats.facet=timestamp',
]

或使用 URL 请求:

http://localhost:8983/solr/fluks-admin/select?q={!join+from=id+to=sector_id+score=none}{!join+from=uri+to=service+score=none}uri:/test-en/service-en*+AND+-deleted:true&fq={!cache=false}category:indicator+AND+timestamp:[201608+TO+201610]+AND+type:("-3" +OR+2+OR+3)+AND+-deleted:true&wt=json&indent=true&json.facet={sum_timestamp:{terms:{limit:-1, field:timestamp, 方面:{sum_type:{条款:{limit:-1, field:type, 方面:{sum_vol_value:"sum(vol_value)"}}}}}}}