【问题标题】:Elastic Search Street Range Search弹性搜索街道范围搜索
【发布时间】:2018-07-20 21:04:09
【问题描述】:

我们在 Elastic Search 中有两个字段 Street Number 1 和 Street Number 2。我们在 Elastic Search 中还有一个地址字段,地址是 2 个字段与其他一些字段的组合。所以我们有一个地址:

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

如果用户使用 1610 搜索,则应返回两个地址。

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

【问题讨论】:

  • 我会尝试使用 range 数据类型,并可能创建另一个该类型的字段,其中包含给定地址的最小和最大街道号码。
  • 我们希望在弹性搜索中同时存储街道编号 1 和街道编号 2。所以我的逻辑应该是 > 比 1 号街道 &

标签: elasticsearch search


【解决方案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
      }
    }
  }
}

【讨论】:

  • 感谢您的回复。我会试试这个。
  • 反过来如何工作?如果用户搜索的范围是 1600-1650,那么我们应该返回两个地址。
  • 感谢 Val 的回答。我有点坚持如何在跨字段查询中使用它们。我们可以在交叉字段内有一个范围
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多