使用elastic4s进行GeoDistance查询

时间:2014-09-12 09:59:17

标签: scala elasticsearch dsl elastic4s

我在理解用于形成GeoDistance查询的DSL语法时遇到一些问题(获取距离某点一定距离内的所有条目);

目前,在带有"places" -> "shops"的ES索引id = 1中,我有一个示例条目;

{
  _index: "places",
  _type: "shops",
  _id: "1",
  _version: 5,
  found: true,
  _source: {
    location: {
      lat: 50,
      lon: 50
    },
    name: "coffee store",
    posted: "2014-09-12T08:53:01.673Z"
  }
}

然后,使用Elastic4s DSL,我建立了一个搜索查询;

val nearbyStoresFuture:Future[SearchResponse] = client execute {
  search in "places" -> "shops" filter {
    geoDistance("location") point(lat, lon) distance(distance)
  }
}
nearbyStoresFuture onComplete {
  case Success(s) => {
    s
    client.close
  }
  case Failure(t) => {
    t
    client.close
  }
}

在这种情况下:

lat: Double = 50.0
lon: Double = 50.0
distance: String = "50km"

所以在任何情况下,如果查询是正确的,这应该给我包含ES中条目的结果,因为它与条目在同一点,因此在50km的距离内。

查询成功但结果为空。

编辑:以下是映射的外观;

ES.execute {
  create index "places" mappings(
    "shops" as (
      "location" typed GeoPointType,
      "name" typed StringType,
      "posted" typed DateType
      )
    )
}

这有什么问题?

1 个答案:

答案 0 :(得分:1)

这不是一个弹性问题,而是一个普遍的弹性搜索问题:tl; dr你没有索引任何字段。

索引数据时,指定索引哪些字段,然后将这些字段用于搜索。此外,您可以存储在搜索与该文档匹配时可以获取的文档。如果您希望能够返回原始文档,但希望在编制索引时使用字段子集或派生字段,这将非常有用。

在elastic4s

index into "myindex"->"mytype" fields ("name"->name, "location"->latlong) source srcdoc

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-source-field.html http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/index-doc.html