【问题标题】:elastic search get distinct random field values弹性搜索获得不同的随机字段值
【发布时间】:2017-10-28 02:44:23
【问题描述】:

我们有具有以下字段的弹性搜索文档:

{
  "stockId": 1
  "sellerId": 100
}

多个stockId 可以映射到单个sellerId,但一个库存只能映射到一个dealer。大约有 10,000 只股票映射到 1,000 个卖家。但是每个 SellerId 可能有不同数量的股票,即少数可能有 100 个,而其他人只有 1 个。

问题陈述:我们想从所有这些被索引的文档中选择“N”个随机文档。条件是这些“N”文件中的每一个都应该属于不同的卖家,即不同的“sellerId”。 (我们需要奖励这些卖家)。

我尝试过的:我正在尝试通过获取“N”个随机不同“sellerId”的弹性查询来解决这个问题。 (然后弹性查询以获取每个“N”个卖家的 1 个文档)。一种方法是聚合“sellerId”,然后选择随机的“N”个键,但这在性能方面并不理想。有人可以帮助更好地查询吗?

【问题讨论】:

  • 你真的需要在查询时这样做吗?这种数据存储的黄金法则是优化您的查询数据 - 您能否扩展您的问题的上下文,因为这可能是XY problem
  • 我同意。我已经修改了原来的问题。
  • 第一直觉 - 您可以维护不同卖家的单独列表(可能是另一个索引)并随机抽样(可能通过随机分数搜索)。不过可能有更直接的解决方案。

标签: elasticsearch


【解决方案1】:

我将重建我的映射以创建嵌套文档类型,其中卖方是父对象,stockid 是嵌套对象:

{
  "sellerid" : {"type" : "integer" },
  "stock_obj" : {
    "type" : "nested",
    "properties" : {
      "stockid" : { "type" : "integer" }
    }
}

当您重建索引时,您将只为每个卖家创建一个对象。每个卖家都会有他们所有的股票 ID。似乎每个卖家大约有 10 只股票,elasticsearch 可以很好地处理这个问题。 (如果每个卖家有数千只股票,我会采取不同的做法)

然后,我将搜索 N 个卖家 sorted randomly,然后作为第二个排序字段,您将对股票 ID 进行随机排序。不是最简单的映射,但查询很简单,应该很快。

另外,如果您只是处理约 1 万个整数的卖家/库存数据点,那么使用弹性搜索可能是矫枉过正。它可以做你想做的事,但它的主要目的是搜索大量文本。

【讨论】:

  • 我写的少了,实际上是 10L。您能否分享一些示例以随机搜索“N”个卖家,然后随机选择股票 ID 作为第二个排序字段?
  • 我认为有些混乱..这个例子是为了确保单个分数级别中的所有文档都获得相似的曝光量。例如,如果有 100 个文档得分为 2 的文档,他们应该获得相似的曝光。但我们的情况不同。我们希望对所有卖家 ID 给予相同的曝光,即如果我们有 5 个卖家 ID 为 1 的文档和 95 个卖家 ID 为 2 的文档,他们仍然应该有相同的机会被选中
  • 我明白你的意思。在你的情况下,因为每个卖家的股票很少,你可以使用 random_score 来选择一个随机卖家。然后你可以随机从每个卖家那里拉一个股票。
  • 没有。这种方法也有问题。如果卖家 1 有 5 个文档,卖家 2 有 95 个股票,那么卖家 2 的文档将被随机选择 19 次。但我希望卖家 1 和卖家 2 文档都以平等的机会被选中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多