用于聚合的数据库/搜索引擎

时间:2017-06-25 10:49:40

标签: elasticsearch aggregation elasticsearch-aggregation

我正在寻找符合以下要求的数据库/搜索引擎:

  • 条目的值将是以下类型之一:number,string,date,object,numbers / strings / objects列表。
  • 我想根据一个字段或多个字段将条目分组/分成多个字段(如果x条目具有相同的field1& field2& field3,则应将其分组在一个存储桶中),或者按范围分组。
  • 我将分组的字段可以是上述任何一种类型(特别是,如果“group by”字段是字符串列表,则只有两个条目包含相同列表时才会将它们组合在一起确切的项目。)
  • 我想根据它们的大小过滤桶(不要返回大小<2的桶)。
  • 非常重要:对于每个存储桶,应该有一种方法可以返回创建存储桶的条目。
  • 聚合前过滤。
  • 它应该有效地支持至少5000万个条目。

Big Plus但不是必须的:

  • 能够在每个存储桶的条目上运行脚本(我看到的一些聚合只计算每个存储桶上的max / avg / mean等函数,但没有自定义脚本)。
  • 按字段分组相似。

请注意,该软件在内部运行,并且没有DevOps来维护过于复杂的环境(如Spark)。

示例

条目:

{"id": 1, "name": "Bob", "number_of_siblings": 2, "birthday": 5.5.2000, "hobbies" ["painting", "reading"], "education": {"school": "schoolName", "subject: {"name": "math", "level" : 2}}}}

{"id": 2, "name": "Jane", "number_of_siblings": 2, "birthday": 7.6.2001, "hobbies" ["painting", "reading"], "education": {"school": "schoolName1", "subject: {"name": "math", "level" : 3}}}}

{"id": 3, "name": "Dana", "number_of_siblings": 1, "birthday": 7.6.1995, "hobbies" ["Swimming", "Jumping rope"], "education": {"school": "schoolName2", "subject: {"name": "English", "level" : 1}}}

{"id": 4, "name": "Alex", "number_of_siblings": 1, "birthday": 7.6.1997, "hobbies" ["Swimming", "Jumping rope"], "education": {"school": "schoolName1", "subject: {"name": "math", "level" : 1}}}

{"id": 5, "name": "Natalie", "number_of_siblings": 1, "birthday": 7.6.1991, "hobbies" ["Swimming", "Jumping rope", "piano"], "education": {"school": "schoolName1", "subject: {"name": "math", "level" : 1}}}

可能的查询:

  • 仅过滤学习数学和英语的学生(“主题” - &gt;“名称”)。
  • 只有在同一个十年出生并且具有相同爱好的学生,才能放入一个桶中。

结果信息桶

Bucket 1:

  • 参赛作品1和2(学习数学,出生于2000年代,爱好:[“绘画”,“阅读”])

Bucket 2:

  • 参赛作品3和4(学习数学或英语,出生于90年代,爱好:[“游泳”,“跳绳”])。

Bucket 3:

  • 第5项:不在第2桶中,因为业余爱好并不完全相同。

在结果中,我想在每个桶中获取事件,而不仅仅是摘要。 (对于存储桶1,获取条目1和2 - 我上面写的完整条目)

到目前为止,弹性搜索满足了大多数要求(除了“大加但不是必须”的要求),尽管我还没有对数百万条目进行性能测试。 在弹性搜索中,我使用桶聚合(标记为“min_doc_count”:2)和顶部命中聚合的子桶,并使用大“size”参数来获取所有命中。

我想知道这是否足够有效还是有更好的方法。

谢谢。

0 个答案:

没有答案