使用ElasticSearch的基本geosearch

时间:2016-08-07 20:52:23

标签: amazon-web-services elasticsearch amazon-dynamodb

我正在使用Dynamo和Amazon ElasticSearch服务在AWS上整理一个概念验证,但我遇到了一些麻烦

我已经检查过ES仪表板并看到以下内容......

我有一个索引[assets]和一个映射[asset_types]。下面是一些映射的示例,以及相关位置

POST assets/_search
{
    "bool" : {
        "must" : {
            "match_all" : {}
        },
        "filter" : {
            "geo_distance" : {
                "distance" : "200km",
                "General.location" : {
                    "lat" : 40,
                    "lon" : -70
                }
            }
        }
    }
}

我希望地理位置搜索位于“General.location”字段中。到目前为止,我已经尝试了几个不同的查询而没有任何运气,但我确信我错过了一些相当明显的问题。

一个来自官方文档here,修改为下面的结果,出现此错误: “原因”:“未能解析搜索源。未知搜索元素[bool]”,

POST assets/_search
{
   "filter" : {
      "geo_distance" : {
         "distance" : "1km",
         "General.location" : {
                        "lat" : 40,
                        "lon" : -70
                    }
      }
   },
   "query" : {
      "match_all" : {}
   }
}

我也尝试过稍微不同的查询,引发“”原因“:”找不到geo_point字段[General.location]“

prod

我是否错误地运行了查询?我是否需要更新索引中的映射以指定地理索引?我想如果我正确地格式化了那些不是必需的字段。

由于

2 个答案:

答案 0 :(得分:0)

问题在于您的映射,其中General.location字段未正确映射。这就是您收到错误failed to find geo_point field

的原因

所以而不是

General [this is a map]
    location 
        lat *string*
        lon *string*

你需要

General [this is a map]
    location *geo_point*

因此,您需要相应地修改映射并重新索引数据。

您遇到的第二个问题是您的第一个查询需要包含在query部分中:

POST assets/_search
{
  "query" : {
     "bool" : {
        "must" : {
            "match_all" : {}
        },
        "filter" : {
            "geo_distance" : {
                "distance" : "200km",
                "General.location" : {
                    "lat" : 40,
                    "lon" : -70
                }
            }
        }
     }
  }
}

一旦您解决了这两个问题,您就可以成功运行查询。

答案 1 :(得分:0)

除了Val所说的,我还为位置

创建了一个新的映射

我明确地为此创建了一个映射。请注意其他新手,我需要使用嵌套属性更新来创建“General.deviceLocation”。在我这样做之后,Val的更新查询起作用了。

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();