以嵌套栏位排序我们可以依照嵌套栏位中的值来排序,甚至藉由分离嵌套文档中的值。为了使其结果更加有趣,我们加入另一个记录:PUT /my_index/blogpost/2{ "title": "Investment secrets", "body": "What they don't tell you ...
查询嵌套对象因嵌套对象(nested objects)会被索引为分离的隐藏文档,我们不能直接查询它们。而是使用 nested查询或 nested 过滤器来存取它们:GET /my_index/blogpost/_search{ "query": { "bool": { "must": [ { "match": { "title": "eggs" }}, <1> { "nested": { "path": "comments", <2>
嵌套对象映射设定一个nested栏位很简单--在你会设定为object类型的地方,改为nested类型:PUT /my_index{ "mappings": { "blogpost": { "properties": { "comments": { "type": "nested", <1>
嵌套对象事实上在Elasticsearch中,创建丶删除丶修改一个文档是是原子性的,因此我们可以在一个文档中储存密切关联的实体。举例来说,我们可以在一个文档中储存一笔订单及其所有内容,或是储存一个Blog文章及其所有回应,藉由传递一个comments阵列:PUT /my_index/blogpost/1{ "title": "Nest eggs", "body": "Making your money work...
地理形状 的查询和过滤都是表现为相同功能。查询就是简单的表现为一个过滤:把所以匹配到的文档的 _score 标记为1。查询结果不能被缓存,不过过滤结果可以。结果默认是不被缓存的。与地理坐标点集类似,任何形状内坐标的变化都会导致 geohash 集合的变化,因此在缓存过滤结果几乎没有什么意义。也就是说,除非你会重复的使用相同的形状来做过滤,它才是值得缓存起来的。
对于那些经常会在查询中使用的形状,可以把它们索引起来以便在查询中可以方便地直接引用名字。以之前的阿姆斯特丹中央为例,我们可以把它存储为一个类型为 neighborhood 的文档。
地理形状一个不寻常的地方在于它运行我们使用形状来做查询,而不仅仅是坐标点。举个例子,当我们的用户刚刚迈出阿姆斯特丹中央火车站时,我们可以用如下方式,查询出方圆1km内所有的地标:GET /attractions/landmark/_search{ "query": { "geo_shape": { "location": { <1> "shape": { <2> "type": "circle", <3>
地理形状通过GeoJSON来表示,这是一种开放的使用JSON实现的二维形状编码方式。每个形状包含两个信息:形状类型:point, line, polygon, envelope;一个或多经纬度点集合的数组。注意:在 GeoJSON 里,经纬度表示方式通常是“纬度在前,经度在后”。
与 geo_point类型的字段相似,地理形状也需要在使用前明确映射:PUT /attractions{ "mappings": { "landmark": { "properties": { "name": { "type": "string" }, "location": { "type": "geo_shape" } } } }}你需要关注两个重要的设置项来调整精度(precision)和距离误差(distance_erro…
地理形状(geo-shapes)使用一种与地理坐标点完全不同的方法。我们在计算机屏幕上看到的圆形并不是由完美的连续的线组成的;而是用一个个连续的像素点来画出的一个近似圆。地理形状的工作方式就与此相似。复杂的形状 -- 比如 点集,线,多边形,多多变形,中空多边形等 -- 都是通过一个个 geohash单元来画出的。这些形状会转化为一个被它所覆盖到的 geohash 集合。
在geohash聚合器的例子中,我们使用了一个矩形框过滤器来将结果限制在纽约区域。然而,我们的结果都分布在曼哈顿。当在地图上呈现给用户时,合理的方式是可以缩放到有数据的区域;地图上有大量空白区域是没有任何点分布的。范围过滤器是这么做得:它计算出一个个小矩形框来覆盖到所有的坐标点。GET /attractions/restaurant/_search?
一个查询返回的结果集中可能包含很多的点,以至于不能在地图上全部单独显示。geohash单元聚合器可以按照你指定的精度计算每个点的geohash并将相邻的点聚合到一起。返回结果是一个个单元格,每个单元格对应一个可以在地图上展示的 geohash。通过改变 geohash 的精度,你可以统计全球、某个国家,或者一个城市级别的综述信息。
按距离聚合对于类似“找出距我1公里内的所有pizza店”这样的检索场景很适合。检索结果需要确实地只返回距离用户1km内的文档,不过我们可以再加上一个“1-2km内的结果集”:GET /attractions/restaurant/_search{ "query": { "filtered": { "query": { "match": { <1>
虽然地理位置过滤或评分功能很有用,不过更有用得是将信息再地图上呈现给用户。检索的结果集可能很多而不能将每个点都一一呈现,这时候就可以使用地理位置聚合来把这些位置点分布到更加可控的桶(buckets)里。
geohash单元过滤器做的事情非常简单:把经纬度坐标位置根据指定精度转换成一个geohash,然后查找落在同一个geohash中的位置--这实在是非常高效的过滤器。GET /attractions/restaurant/_search{ "query": { "filtered": { "filter": { "geohash_cell": { "location": { "lat": 40.718, "lon": -73.
首先,你需要确定你需要什么样的精度。虽然你也可以使用12级的精度来索引所有的地理坐标点,但是你真的需要精确到数厘米的精度吗?
Geohashes 是一种将 经纬度坐标对(lat/lon)编码成字符串的方式。最开始这么做只是为了让地理位置在url上呈现的形式更加友好,不过现在geohash已经变成一种在数据库中有效索引地理坐标点和地理形状的方式。Geohashes 把整个世界分为32个单元的格子--4行8列--每一个格子都用一个字母或者数字标识。比如 g 这个单元覆盖了半个格林兰,冰岛的全部和大不列颠的大部分。
关注时代Java