弹性搜索街道范围搜索

时间:2018-02-10 03:26:16

标签: elasticsearch search

我们有两个街道号码1&弹性搜索中的街道2号。我们在弹性搜索中也有一个地址字段,地址是两个字段和其他一些字段的组合。所以我们有一个地址:

  • 1604-1612 Calver Building
  • 1608-1645 Park House

如果用户正在搜索1610,则应返回该地址。

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

1 个答案:

答案 0 :(得分:2)

我们的想法是利用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
      }
    }
  }
}