我是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然后请求它们的详细信息? - 有没有办法在这个请求中加入合同信息? - 或者最佳做法是逐个请求每个文件?
问题是我不想要求无用的数据(性能,带宽)。
答案 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)"}}}}}}}