是否可以在ElasticSearch中创建预定义范围过滤器方面?

时间:2014-04-04 14:44:45

标签: filter elasticsearch range facet

我需要有一个预定义范围滤镜方面。范围过滤器将用于学校的等级范围。我想要K-2,3-5,6-8,9-12,每个人。我的记录有MinGrade和MaxGrade字段。它们可以具有值K,1,2 ......,12或Everyone。我想我可以使用范围过滤器。但我无法弄清楚如何使用2个不同的字段组合,落入上面的预定义范围。 有什么建议?我希望这是有道理的。

我希望facet输出看起来像这样......

  • K-2(xxx)
  • 3-5(xxx)
  • 6-8(xxx)
  • 9-12(xxx)
  • 其他人(xxx)

由于我已更改为1个DB列,因此我可以使用范围查询,也很好奇是否可以添加自定义标签,如下所示"facets": { "Grade": { "range": { "field": "Grade", "ranges": [ {"label" : "K-2", "gte": 0, "lte": 2}, {"label" : "3-5", "gte": 3, "lte": 5}, {"label" : "6-8", "gte": 6, "lte": 8}, {"label" : "9-12", "gte": 9, "lte": 12}, {"label" : "Above 12", "gte": 13} ] } } }

1 个答案:

答案 0 :(得分:1)

从评论来回反复我相信我明白你想要什么。

即: 可以为AminGrade之间的每个成绩显示记录maxGrade

例如: 123minGrade = 2之间的每个成绩都可能会显示maxGrade = 6条记录。

查询:

  1. 对于给定的等级x,返回minGrade <= x <= maxGrade
  2. 的所有记录
  3. 在此问我相信:对于给定的成绩范围,例如[x1. x2],确定所有具有非空重叠的记录,并给出其范围{ {1}}
  4. 如下:

    1. 鉴于成绩[minGrade, maxGrade](伪代码):x
    2. 您需要为每个存储桶构建单独的filter-facets。例如:对于minGrade <= x AND x <= maxGrade,您可以执行以下任一操作:

      1. 6-8
      2. (minGrade <= 6 AND 6 <= maxGrade) OR (minGrade <= 8 AND 8 <= maxGrade)
    3. 2.2。可以使用2个rangeQueries实现:(6 <= minGrade AND minGrade <= 8) OR (6 <= maxGrade AND maxGrade <= 8)上的1个和mingrade上的1个maxgrade

      因此,过滤器构面的示例1可以是(未经测试的):

      OR

      编辑:以上是:

      • facet名为 { "facets": { "grade_6-8": { "filter": { "or": [{ "range": { "minGrade": { "gte": 6, "lte": 8 } } }, { "range": { "maxGrade": { "gte": 6, "lte": 8 } } }] } } } }
      • 类型&#34;过滤方面&#34;
      • 包含grade_6-8 - 过滤器
      • 又包含2 range filtersor为1,minGrade为1。
      • 注意您应该对所需的所有范围重复此操作

      编辑2 当每个文档仅定义1 maxGrade而不是GrademinGrade时,解决方案会发生变化。可以使用简单的范围查询来完成此操作。类似的东西:

      maxGrade

      如果这不是您之后的事情,请更具体地说明您想要的内容。