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,然后请求它们的详细信息?
- 有没有办法加入这个请求中的合同信息?
- 或者最好的做法是逐个请求每个文档?
问题是我不想请求无用的数据(性能、带宽)。
您可以使用以下形式的一些工具:
- Solr's Block Join Query Parser(允许简单的 parent/child
查询)。
- Solr Facets (which allow for aggregrations (e.g. sum of payments) ... with recent support for faceting on parent/child fields).
- Solr 扩展组件(最近 allows parent information to be expanded from a child block join query)。
但是,我不确定您是否可以在一个查询中完成您希望的所有事情(与这些部分一起使用)。即使可以,将它们拼接在一起也比不上您希望复制的 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)"}}}}}}}
我是 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,然后请求它们的详细信息? - 有没有办法加入这个请求中的合同信息? - 或者最好的做法是逐个请求每个文档?
问题是我不想请求无用的数据(性能、带宽)。
您可以使用以下形式的一些工具:
- Solr's Block Join Query Parser(允许简单的 parent/child 查询)。
- Solr Facets (which allow for aggregrations (e.g. sum of payments) ... with recent support for faceting on parent/child fields).
- Solr 扩展组件(最近 allows parent information to be expanded from a child block join query)。
但是,我不确定您是否可以在一个查询中完成您希望的所有事情(与这些部分一起使用)。即使可以,将它们拼接在一起也比不上您希望复制的 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)"}}}}}}}