当前位置: 首页 > 面试题库 >

Elastic Search按嵌套文档的数量过滤

柴瀚
2023-03-14
问题内容

我有一个针对 公司 的elasticsearch索引,该索引具有一个称为 事务 的嵌套对象。交易至少有一个 日期 字段。这是一个示例:

firms: [
  {
    "name": "abc",
    "address" : "xyz",
    "transactions": [
       {
         "date" : "2014-12-20"
         "side" : "buyer"
       },
       ...
     ]
  },
  ...
]

有了这些数据,我想查询过去6或12个月内所有(例如)交易超过3次的公司。

以下查询返回在过去12个月中至少有一笔交易的公司:

POST firms/firm/_search
    {
    "query": {
        "nested": {
           "path": "transactions",
           "query": {
               "bool": {
                   "must": [
                      {
                          "match": {
                             "transactions.side": "buyer"
                          }
                      },
                      {
                          "range": {
                             "transactions.date": {
                                "from": "2014-10-24",
                                "to": "2015-10-24"
                             }
                          }
                      }
                   ]
               }
           }
        }  
    }
}

我不确定如何扩展此查询以匹配在y +个月内进行x +交易的公司。任何帮助将不胜感激。谢谢


问题答案:

除了使用,我认为您别无选择script。像这样:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "transactions",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "transactions.side": "buyer"
                    }
                  },
                  {
                    "range": {
                      "transactions.date": {
                        "from": "2014-10-24",
                        "to": "2015-10-24"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "filtered": {
            "filter": {
              "script": {
                "script": "if(_source.transactions.size<3) return false;fromDate=Date.parse('yyyy-MM-dd',fromDateParam);toDate=Date.parse('yyyy-MM-dd',toDateParam);count=0;for(d in _source.transactions){docsDate=Date.parse('yyyy-MM-dd',d.get('date'));if(docsDate>=fromDate && docsDate<=toDate){count++};if(count==3){return true;}};return false;",
                "params": {
                  "fromDateParam":"2014-10-24",
                  "toDateParam":"2015-10-24"
                }
              }
            }
          }
        }
      ]
    }
  }
}

range对于没有日期匹配的那些文档,实际的过滤器是“优化”的。因此,此文档(范围内没有日期)将不会到达费用更高的script过滤器。

script本身首先检查是否交易的数量少于3。如果是这样,请不要打扰所有日期检查并返回false。如果超过,3则取每个日期并与参数进行比较。一旦3达到计数,请停止查看其余日期并返回true



 类似资料:
  • null 我也尝试使用scripted_field,但是脚本字段似乎是在最后一个阶段计算的,在查询过程中不可用。 我也有一个按照相同逻辑进行排序的方法(根据给定仓库中库存的总和对产品进行排序),它像一个魅力一样工作: 但我也找不到访问此排序值的方法:(

  • 问题内容: 我正在编写资产管理应用程序。它允许用户通过向资产添加html控件(例如文本字段,选择菜单等)来存储任意资产属性。然后,该属性的JSON表示成为存储在beddb中的资产JSON文档的一部分。资产在ouchdb中具有以下结构: 我不确定将属性放入数组是否是允许基于属性值搜索资产的最佳方法。将属性直接附加到资产作为属性会更好吗?我正在用Elasticsearch做实验。如果我尝试按原样存储文

  • 我是elasticsearch的新手,对如何进行过滤器、查询和聚合有一些想法,但不确定如何解决下面的问题。我希望能够从下面显示的文档中只查询公司的最新交付(日期和crate_quantity)。我不确定如何去做。有没有办法使用最大聚合从每个文档中只提取最近的交付?

  • 问题内容: 我有看起来像这样的文档(以下是两个示例): 和 数组中子文档的格式将始终具有an 和a,但是这些子文档的数量将可变,每个子文档具有不同的值。 我想知道是否可以根据与特定值匹配的值之一对这种格式的文档进行排序。我真的很想能够做到这一点: 通过对文档进行排序下降,其中相关的。文档s 的最终排序为1234,6346。 通过对文档进行排序下降,其中相关的。文档s 的最终排序为6346,1234

  • 我正在使用弹性搜索。我以前从未使用过的网络NEST客户端。我想做的是在得分前按日期范围过滤结果。 我使用对象初始值设定项语法,因为它最适合我。 我已经完成了我想要的: 这给了我一个JSON请求,就像我期望的那样: 但留档过滤查询说"弃用在2.0.0-beta1.改为使用bool查询,查询的必须子句和筛选器子句”。 因为这是我发现的唯一包含过滤器的方法,有没有更好的方法来使用嵌套对象初始值设定项语法

  • 在这里给ElasticSearch的初学者排名。 我有一个客户列表,他们的订单作为一个嵌套字段。假设文档结构如下: 我想查询的是:在两个日期之间订购了一定数量的用户列表。我希望能够将它与例如生日的范围查询结合起来。 我已经到了这样的地步,我可以使用聚合来获得每个订户在两个日期之间的排序总和: 但是,我想限制查询部分返回的结果,以便更好地与所有其他过滤器混合。 我的第一个想法是使用一个脚本过滤器,并