使用弹性搜索进行数据建模

时间:2015-01-07 08:55:47

标签: elasticsearch lucene domain-driven-design modeling domain-data-modelling

我们有一个复杂的领域模型,我需要在弹性模型中进行建模,我似乎无法找到最好的方法。 我们的简化域模型如下:

  • 餐厅
  • 餐厅(单一地点) - 包含地址和GPS坐标。
  • 菜单项 - 由链提供,但可能无法在该链中的所有位置投放。

对索引的典型查询是: “从我当前的位置半径1英里范围内找到我所有'巧克力蛋糕',按相关性排序,但不要在同一链条中显示重复项,该链条最近位置的距离和地址就足够了”。查询还需要支持分页(显示前10个结果,接下来10个等)

这种模型的理想映射是什么?

我目前看到两个选项:

  1. 每个链条每个项目存储一个文档。如果链X有“巧克力蛋糕”,我们将只有一个文件。该文档将包含携带此项目的所有位置的数组。弹性中的距离滤波器似乎能够处理GPS坐标数组,但是一旦我从弹性中获得结果,我仍然需要手动迭代所有嵌套的餐馆记录,再次计算距离并找到最接近的距离以便呈现 与物品的正确距离。 优点:它的工作原理。缺点:项目文档中嵌套餐馆记录的数组可能会变大(每个链数万个位置),所以首先我不确定弹性是如何处理这个,其次是迭代这个数组O( n)对于每个可以避免的请求,计算距离看起来像我的服务器上的不必要的负载。

  2. 每个位置每个项目存储一个文档(如果链X有100个位置并且都提供巧克力蛋糕,我们将在系统中为“X链中的巧克力蛋糕”提供100个类似文档,每个文档将与另一个只有地址和GPS坐标。优点:文件很小,我们不必手动迭代内部数组的位置。缺点:我们有重复的问题,多个文件“链X中的巧克力蛋糕”可以得到过去的距离过滤器,我们需要在得到弹性结果后手动过滤掉这些副本。将分页投入到混合中,这变得非常重要。

  3. 还有其他选项可以更有效地对其进行建模吗?有没有办法调整#1或#2来消除它们的缺点?

    由于 梅德

0 个答案:

没有答案