一尘不染

elasticsearch街道范围搜索

elasticsearch

在elasticsearch中,我们有两个字段:街道编号1和街道编号2。我们在Elastic
Search中还有一个Address字段,而Address是2个字段与其他一些字段的组合。因此,我们的地址为:

  • 1604-1612卡尔弗大厦
  • 1608- 1645公园别墅

如果用户使用1610搜索,则应同时返回该地址。

有关如何形成查询的任何帮助?


阅读 389

收藏
2020-06-22

共1个答案

一尘不染

想法是利用range数据类型并将最小和最大街道号存储在该字段中。

在映射中,您将具有以下内容:

PUT property_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "street_number_range": {
          "type": "integer_range"
        },
        "street_name": {
          "type": "text"
        }
      }
    }
  }
}

然后,您可以像这样添加两个文档:

PUT property_index/_doc/1
{
  "street_number_range" : { 
    "gte" : 1604,
    "lte" : 1612
  },
  "street_name": "Calver Building"
}

PUT property_index/_doc/2
{
  "street_number_range" : { 
    "gte" : 1608,
    "lte" : 1645
  },
  "street_name": "Park House"
}

最后,您的查询将如下所示,并且将返回两个文档

GET property_index/_search
{
  "query" : {
    "term" : {
      "street_number_range" : {
        "value": 1610
      }
    }
  }
}

更新

您还可以使用以下查询搜索范围:

GET property_index/_search
{
  "query" : {
    "range" : {
      "street_number_range" : {
        "gte": 1600,
        "lte": 1650
      }
    }
  }
}
2020-06-22