Elasticsearch:选择TOP N文档并应用查询

时间:2013-11-25 16:56:00

标签: elasticsearch

抱歉,我不擅长英语,请理解。

我们假设我有这样的数据:

title    category    price
book1      study     10
book2      cook      20
book3      study     30
book4      study     40
book5      art       50

我可以在'研究'中搜索书籍。类别并按价格降序排序"。结果将是:

book4 - book3 - book1

然而,我无法找到办法 "搜索书籍' study'类别在价格上涨40%的书籍中#34;。 (我希望'价格上涨40%'是正确的表达方式) 在这种情况下,结果应该是" book4"只是因为"类别搜索"将只为book5和book4执行。

起初,我以为我可以通过

来做到这一点
  1. 按价格排序所有文件
  2. 选择TOP 40%
  3. 在其中发布另一个类别搜索查询
  4. 但是现在,我仍然不知道如何在"部分文档"中发布查询,而不是所有文档。在2之后,我有一份TOP 40%的文件清单。但是,如何才能进行仅适用于它们的查询?

    我意识到我甚至不知道"搜索TOP n%"在弹性搜索中。有没有一种方法比"排序所有并选择第一个n%"?

    任何建议都将不胜感激。 这是我在stackoverflow中的第一个问题。如果我的问题违反了这里的任何规则,请告诉我,以便我能够知道并道歉。

1 个答案:

答案 0 :(得分:-1)

如果您的数据是normally distributed,或者您可以从中了解数据的其他统计分布,您可以在两个查询中执行此操作。

您可以通过执行以下操作来查看直方图形式的数据:

{
  "query": {
    "match_all": {}
  },
  "facets": {
    "stats": {
      "histogram": {
        "field": "price",
        "interval": 100
      }
    }
  }
}

我通常将这些数据放入电子表格中对其进行绘制并对其进行其他统计分析。上面的“间隔”需要是一些合理的值,100可能不合适。

只是决定如何编写中间步骤。如果数据是正态分布的,您可以使用此查询获取有关集合的统计信息:

{
  "query": {
    "match_all": {}
  },
  "facets": {
    "stats": {
      "statistical": {
        "field": "price"
      }
    }
  }
}

上面给出了一个如下所示的输出:

count: 819517
total: 24249527030
min: 32
max: 53352
mean: 29590.023184387876
sum_of_squares: 875494716806082
variance: 192736269.99554798
std_deviation: 13882.94889407679

(以上不是基于您的数据样本,而只是我可以展示统计方面用法的可用数据样本。)

现在您已经了解了所有这些,您可以开始将您的统计知识应用于手头的问题。也就是说,找到第60百分位的Z分数,并根据该分数找到代表数据点的位置。

您的最终查询如何显示:

{
  "query": {
    "range": {
      "talent_profile": {
        "gte": 40,
        "lte": 50
      }
    }
  }

lte将来自stats facet的“max”,而gte将来自你的中间分析。