Solr请求:类似SQL的JOIN,GROUP BY,SUM(),WHERE SUM()

时间:2015-11-10 13:45:55

标签: solr lucene request grouping solr5

我是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",
},

类别:承诺AND 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"
},

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

这是我想要做的: - 默认情况下,仅选择至少具有以下内容的承诺:  。一个sub_category_s:commitment_project,其project_amount_validated_s值。  。一份合同。 - 如果按金额过滤,则仅在此列表中选择具有项目_amount_validated_s的SUM的承诺> amount_min AND< amount_max。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

E.g。开始简单,非规范化,并且只包括搜索所需的数据模型中的字段:

  • 只有一种记录: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 (来自数据库的project_amount_asked的数字和)
    • total_payments_validated (来自数据库的project_amount_validated的数字和)
    • project_names (可搜索项目名称的多值列表)
    • contract_names (可搜索合同名称的多值列表)

然后您的查询只需要一个过滤器:

  

total_payments_validated:[< amount_min> TO< amount_max> ]

强制执行默认条件。

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

答案 1 :(得分:1)

好的,我通过使用!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',
]

或使用网址请求:

http://localhost:8983/solr/fluks-admin/select?q= URI {从= ID +加入+为= sector_id +得分=无!} {从= URI +加入+为=服务+得分=无!}:/测试烯/服务烯* + AND + -deleted:真安培; FQ =类别{缓存=假!}:指示器+ AND +时间戳:[201608 + TO + 201610] +和+型:(" -3&#34 + OR + 2 + OR + 3)+ AND + -deleted:true& wt = json& indent = true& json.facet = {sum_timestamp:{terms:{limit:-1,field:timestamp,facet:{sum_type:{terms:{limit :-1,field:type,facet:{sum_vol_value:" sum(vol_value)"}}}}}}}