【问题标题】:Solr request: SQL-like JOIN, GROUP BY, SUM(), WHERE SUM()Solr 请求:类似 SQL 的 JOIN、GROUP BY、SUM()、WHERE SUM()
【发布时间】:2015-11-10 13:45:54
【问题描述】:

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

category:commitment 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 值。 .一份合同。 - 如果按金额筛选,则仅在此列表中选择具有 project_amount_validated_s > amount_min AND

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

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

【问题讨论】:

    标签: solr lucene request grouping solr5


    【解决方案1】:

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

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


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

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

    total_payments_validated:[TO]

    强制执行您的默认标准。

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

    【讨论】:

    • 非常感谢,我会在星期四看看!
    【解决方案2】:

    好的,我找到了使用 !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, field:type, facet:{sum_vol_value:"sum (vol_value)"}}}}}}}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      相关资源
      最近更新 更多