elasticsearch,Performance,elasticsearch" /> elasticsearch,Performance,elasticsearch" />

Performance 弹性搜索索引设计

Performance 弹性搜索索引设计,performance,elasticsearch,Performance,elasticsearch,我维持了多年的用户活动,包括浏览、购买数据。浏览/购买中的每个条目都是一个json对象:{item_id:id1,item_name,name1,category:c1,brand:b1,event_time:t1} 我想组合不同的查询,比如让所有在t1到t2的时间范围内浏览项目A和/或购买项目B的客户。有数以千万计的客户 我当前的设计是为每个客户使用嵌套对象: customer1: customer_id,id1, name: name1, count

我维持了多年的用户活动,包括浏览、购买数据。浏览/购买中的每个条目都是一个json对象:{item_id:id1,item_name,name1,category:c1,brand:b1,event_time:t1}

我想组合不同的查询,比如让所有在t1到t2的时间范围内浏览项目A和/或购买项目B的客户。有数以千万计的客户

我当前的设计是为每个客户使用嵌套对象:

customer1: customer_id,id1, name: name1, country: US, browse: [{browseentry1_json},{browseentry2_json},...], purchase: [{purchase entry1_json},{purchase entry2_json},...] 通过这种设计,我可以轻松地用嵌套查询组合各种查询。唯一的问题是,旧的浏览/购买数据很难过期:例如,我只想保留一年的浏览/购买数据。在这个设计中,我必须在某个时候读取整个索引,删除过期的浏览/购买数据,然后将它们写回

另一种设计是使用父/子结构。 类型:用户是“浏览”和“购买”类型的父级。 类型browse将包含每个浏览条目。 虽然使用“按查询删除”删除旧数据似乎更容易,但对于上面的查询,我必须执行多个和/或has_子查询,而且性能要差得多。事实上,最初我使用的是父/子结构,但查询时间似乎很长。因此,我放弃了它,并尝试切换到嵌套对象

我也在考虑使用嵌套对象,但将数据分解为不同的类似索引的月度索引,以便可以轻松地使旧数据过期。这种方法的问题是,我必须跨多个索引进行查询,并在这些索引上进行聚合,以获得不同的用户,我认为这会慢得多。我还没有尝试过。该项目的一个要求是能够在可接受的时间范围内给出查询的计数。例如秒,我担心这种方法可能无法接受

ES群集由7台机器组成,每台机器有8个内核和32G内存。 有什么建议吗

提前谢谢!
Chen

我不创建客户指数,而是创建一个浏览指数和一个购买指数,用时间跨度分隔,例如:每月,正如你在上一段中提到的那样。 在每个结构中,我将添加customer字段。现在,您面临两种不同的方法: 1.您只能添加对客户的引用,如id,并进行另一个查询以获取其详细信息。 2.如果没有任何存储问题,可以将客户的所有数据保存在每个结构中

如果这还不足以提高性能,您可以将其与路由相结合,并将所有特定用户的数据保存在同一个碎片上。Elasticsearch不需要在碎片之间获取数据,您可以看到Shay Benon在哪里解释了用户数据流


[和合]这是最自然的思维方式。但我如何做一个简单的跨索引查询,比如谁浏览了项目a,谁购买了项目B?您可以在索引和映射之间使用逗号。顺便说一句,我错写了不同的索引,但你可以把你的类型作为不同的映射浏览,购买。