2017-02-28 443 views
1

我是ElasticSeach的新手,并且我已经索引了elasticseach集群中的城市列表。每个城市包含城市,州,地点(经纬度和长度)等详细信息。ElasticSearch SearchParseException:解析失败[解析源失败]使用geo_distance过滤器时

现在我的要求是搜索特定位置的20公里范围内的城市,为此我需要经过拉特朗已经被索引到集群中的特定城市。

这里是我的索引数据显示在elasticsearch的头插件的用户界面:

{ 
    "_index": "us_large_cities", 
    "_type": "city", 
    "_id": "AVqDpwkjfjWoT7yVe_qt", 
    "_version": 1, 
    "_score": 1, 
    "_source": { 
     "city": "Lincoln", 
     "state": "NE", 
     "location": { 
      "lat": "40.8000011", 
      "lon": "-96.6669599" 
     } 
    } 
} 

这里是我对搜索出来的数据curl命令:

curl -XGET 'http://localhost:9200/us_large_cities/city/_search?pretty=true' -d ' 
{ 
    "query": { 
    "filtered" : { 
     "query" : { 
      "match_all" : {} 
     }, 
     "filter" : { 
      "geo_distance" : { 
       "distance" : "20km", 
       "location" : { 
        "lat" : 40.8000011, 
        "lon" : -96.6669599 
       } 
      } 
     } 
    } 
    } 
}' 

,我得到的SearchParseException这里是完整的堆栈跟踪:

org.elasticsearch.search.SearchParseException: [us_large_cities][2]: from[-1],size[-1]: Parse Failure [Failed to parse source [ 
{ 
    "query": { 
    "filtered" : { 
     "query" : { 
      "match_all" : {} 
     }, 
     "filter" : { 
      "geo_distance" : { 
       "distance" : "20km", 
       "location" : { 
        "lat" : 40.8000011, 
        "lon" : -96.6669599 
       } 
      } 
     } 
    } 
    } 
}]] 
    at org.elasticsearch.search.SearchService.parseSource(SearchService.java:687) 
    at org.elasticsearch.search.SearchService.createContext(SearchService.java:543) 
    at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:515) 
    at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:277) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:231) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:228) 
    at org.elasticsearch.search.action.SearchServiceTransportAction$23.run(SearchServiceTransportAction.java:559) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.elasticsearch.index.query.QueryParsingException: [us_large_cities] failed to find geo_point field [location] 
    at org.elasticsearch.index.query.GeoDistanceFilterParser.parse(GeoDistanceFilterParser.java:159) 
    at org.elasticsearch.index.query.QueryParseContext.executeFilterParser(QueryParseContext.java:347) 
    at org.elasticsearch.index.query.QueryParseContext.parseInnerFilter(QueryParseContext.java:328) 
    at org.elasticsearch.index.query.FilteredQueryParser.parse(FilteredQueryParser.java:74) 
    at org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseContext.java:281) 
    at org.elasticsearch.index.query.IndexQueryParserService.innerParse(IndexQueryParserService.java:382) 
    at org.elasticsearch.index.query.IndexQueryParserService.parse(IndexQueryParserService.java:281) 
    at org.elasticsearch.index.query.IndexQueryParserService.parse(IndexQueryParserService.java:276) 
    at org.elasticsearch.search.query.QueryParseElement.parse(QueryParseElement.java:33) 
    at org.elasticsearch.search.SearchService.parseSource(SearchService.java:671) 
    ... 9 more 

我已经搜索出各种pos但是没有人为我工作。 任何建议,我犯了什么错误?

+0

其中弹性您使用的版本? – paqash

+0

它的1.4.4版本 – KayV

回答

0
[us_large_cities] failed to find geo_point field [location] 

这是你的错误,因为如果你想使用geo_distance过滤器,你必须索引位置字段为geo_point场。更多信息here

编辑:所以

"location": { 
      "lat": "40.8000011", 
      "lon": "-96.6669599" 
     } 

需要被定义为:

{ 
    "city_location" : { 
     "location" : { 
      "lat" : 41.12, 
      "lon" : -71.34 
     } 
    } 
} 
+0

所以,现在我需要修改我的指数?并添加geo_point字段? – KayV

+0

是的 - 请参阅编辑。 – paqash