0

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

类别:承诺和子类别:承诺项目:

{
    "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 值。. 一份合同。- 如果按金额过滤,则仅在此列表中选择总和为 project_amount_validated_s > amount_min AND < amount_max 的承诺。

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

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

4

2 回答 2

1

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

但是,我不确定您是否可以在一个查询中完成您希望的所有事情(与这些部分一起使用)。即使可以,将它们拼接在一起甚至无法实现SELECT...JOIN...GROUP BY...HAVING您希望复制的 SQL 查询的简单性。(除非您想试用具有并行 SQL 支持的Solr 6 开发人员快照)


但是,如果这是您唯一的用例,并且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(来自数据库的 project_amount_asked 的数字总和)
    • total_payments_validated(来自数据库的 project_amount_validated 的数字总和)
    • project_names(可搜索项目名称的多值列表)
    • contract_names(可搜索合约名称的多值列表)

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

total_payments_validated:[<amount_min> TO<amount_max>]

强制执行您的默认标准。

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

于 2015-11-10T19:20:55.780 回答
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',
]

或使用 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, facet:{sum_type:{terms:{limit:-1 ,字段:类型,方面:{sum_vol_value:"sum(vol_value)"}}}}}}}

于 2016-12-07T09:44:26.487 回答