如何在弹性搜索中对高度执行范围搜索

How to perform range searches on Height in elasticsearch

如何在Elasticsearch中表示Height和HeightRange,方便范围搜索

Height.java: int feet, int inches;
HeightRange.java: Height from, Height to

我想搜索特定范围内的用户(比如 5 英尺 - 6 英尺)

如果我很好地理解了您的问题,您可以使用如下范围查询。我做了如下本地测试,其中我摄取了以下数据:

"hits" : [
  {
    "_index" : "height-index-array",
    "_type" : "_doc",
    "_id" : "OfCHdXUB1QlsTOLdRJgd",
    "_score" : 1.0,
    "_source" : {
      "user" : "user1",
      "height" : {
        "feet" : 5,
        "inch" : 8
      }
    }
  },
  {
    "_index" : "height-index-array",
    "_type" : "_doc",
    "_id" : "CfCJdXUB1QlsTOLdEZxS",
    "_score" : 1.0,
    "_source" : {
      "user" : "user2",
      "height" : {
        "feet" : 7,
        "inch" : 9
      }
    }
  },
  {
    "_index" : "height-index-array",
    "_type" : "_doc",
    "_id" : "CvCJdXUB1QlsTOLdEpx5",
    "_score" : 1.0,
    "_source" : {
      "user" : "user3",
      "height" : {
        "feet" : 5,
        "inch" : 6
      }
    }
  },
  {
    "_index" : "height-index-array",
    "_type" : "_doc",
    "_id" : "C_CJdXUB1QlsTOLdE5yk",
    "_score" : 1.0,
    "_source" : {
      "user" : "user4",
      "height" : {
        "feet" : 5,
        "inch" : 8
      }
    }
  },
  {
    "_index" : "height-index-array",
    "_type" : "_doc",
    "_id" : "T_CJdXUB1QlsTOLdFZwx",
    "_score" : 1.0,
    "_source" : {
      "user" : "user5",
      "height" : {
        "feet" : 2,
        "inch" : 3
      }
    }
  }
]

我用来查询height in feet between 5 and 6的查询:

"query": {
    "range": {
    "height.feet": {
        "gte": 5,
        "lte": 6
    }
    }
} 

gte等同于greater than or equal tolte等同于less than or equal to

结果是:

"hits" : {
    "total" : {
    "value" : 3,
    "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
    {
        "_index" : "height-index-array",
        "_type" : "_doc",
        "_id" : "OfCHdXUB1QlsTOLdRJgd",
        "_score" : 1.0,
        "_source" : {
        "user" : "user1",
        "height" : {
            "feet" : 5,
            "inch" : 8
        }
        }
    },
    {
        "_index" : "height-index-array",
        "_type" : "_doc",
        "_id" : "CvCJdXUB1QlsTOLdEpx5",
        "_score" : 1.0,
        "_source" : {
        "user" : "user3",
        "height" : {
            "feet" : 5,
            "inch" : 6
        }
        }
    },
    {
        "_index" : "height-index-array",
        "_type" : "_doc",
        "_id" : "C_CJdXUB1QlsTOLdE5yk",
        "_score" : 1.0,
        "_source" : {
        "user" : "user4",
        "height" : {
            "feet" : 5,
            "inch" : 8
        }
        }
    }
    ]
}

如果您有任何问题,请告诉我,我很乐意提供帮助:)

根据您的要求,如果您需要结合这两个指标,您可以使用 bool 查询:

"query": {
    "bool": {
    "must": [
        {
        "range": {
            "height.feet": {
            "gte": 5,
            "lte": 6
            }
        }
        },{
        "range": {
            "height.inch": {
            "gte": 6,
            "lte": 8
            }
        }
        }
    ]
    }
}

回复:

"hits" : [
  {
    "_index" : "height-index-array",
    "_type" : "_doc",
    "_id" : "OfCHdXUB1QlsTOLdRJgd",
    "_score" : 2.0,
    "_source" : {
      "user" : "user1",
      "height" : {
        "feet" : 5,
        "inch" : 8
      }
    }
  },
  {
    "_index" : "height-index-array",
    "_type" : "_doc",
    "_id" : "CvCJdXUB1QlsTOLdEpx5",
    "_score" : 2.0,
    "_source" : {
      "user" : "user3",
      "height" : {
        "feet" : 5,
        "inch" : 6
      }
    }
  },
  {
    "_index" : "height-index-array",
    "_type" : "_doc",
    "_id" : "C_CJdXUB1QlsTOLdE5yk",
    "_score" : 2.0,
    "_source" : {
      "user" : "user4",
      "height" : {
        "feet" : 5,
        "inch" : 8
      }
    }
  }
]

链接: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html