我需要具有“预定义范围”过滤器构面。范围过滤器将用于学校的成绩范围。我想要K-2、3-5、6-8、9-12,每个人。我的记录包含MinGrade和MaxGrade字段。它们的值可以为K,1、2 ...,12或Everyone。我认为我可以使用范围过滤器。但是我不知道如何结合使用2个不同的字段来落入上述预定义的范围内。
有什么建议么?我希望这是有道理的。

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

  • 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} ] } } }一样添加自定义标签

    最佳答案

    从来回的评论中,我相信我了解您想要什么。

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

    例如:
    可以为123minGrade = 2之间的每个等级显示记录maxGrade = 6

    查询:

    给定等级x的

  • ,返回其minGrade <= x <= maxGrade
  • 的所有记录
  • 在这里问,我相信:对于给定的等级范围,说[x1. x2],根据给定的范围[minGrade, maxGrade]
  • 确定所有具有非空重叠的记录

    如下:
  • 给定的等级x(以伪代码表示):minGrade <= x AND x <= maxGrade
  • 您需要为每个存储桶分别构建filter-facets。例如:对于6-8,您可以执行以下任一操作:
  • (minGrade <= 6 AND 6 <= maxGrade) OR (minGrade <= 8 AND 8 <= maxGrade)
  • (6 <= minGrade AND minGrade <= 8) OR (6 <= maxGrade AND maxGrade <= 8)

  • 2.2。可以使用2个rangeQueries来实现:1个在mingrade上,1个在maxgradeOR组合

    因此,筛选器构面的示例1可以是(未试用):
        {
            "facets": {
                "grade_6-8": {
                    "filter": {
                        "or": [{
                            "range": {
                                "minGrade": {
                                    "gte": 6,
                                    "lte": 8
                                }
                            }
                        },
                        {
                            "range": {
                                "maxGrade": {
                                    "gte": 6,
                                    "lte": 8
                                }
                            }
                        }]
                    }
                }
            }
        }
    

    编辑:以上是一个:
  • 构面称为grade_6-8
  • 类型为“过滤器构面”的
  • 包含or
  • -过滤
  • ,其中又包含2 range filters。 1表示minGrade,1表示maxGrade
  • 注意您应该为需要单独使用的所有范围重复此操作

  • 编辑2
    当每个文档仅定义1个Grade而不是minGrademaxGrade时,解决方案将更改。使用简单的rangequery可以做到这一点。就像是:
        {
            "query": {
                "match_all": {}
            },
            "facets": {
                "grade_ranges": {
                    "range": {
                        "field": "grade",
                        "ranges": [{
                            "to": 2
                        }, {
                            "from": 3,
                            "to": 5
                        }, {
                            "from": 6,
                            "to": 8
                        }, {
                            "from": 9,
                            "to": 12
                        }, {
                            "from": 13
                        }]
                    }
                }
            }
        }
    

    如果这不是您要追求的目标,请更具体地说明您要的目标。

    关于filter - 是否可以在ElasticSearch中创建预定义范围过滤器构面?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22865914/

    10-08 21:09