私はElasticSearch(v 20.6)でクラブ化されたGrailsプロジェクトに取り組んでおり、elasticsearch-grails-plugin(geo_pointインデックス作成をサポートするため:v.20.6)のカスタムビルドを使用して、script_fields(距離を計算します)。以下は Closure と GXContentBuilder から生成された JSON です。
閉鎖
records = Domain.search(searchType:'dfs_query_and_fetch'){
query {
filtered = {
query = {
if(queryTxt){
query_string(query: queryTxt)
}else{
match_all {}
}
}
filter = {
geo_distance = {
distance = "${userDistance}km"
"location"{
lat = latlon[0]?:0.00
lon = latlon[1]?:0.00
}
}
}
}
}
script_fields = {
distance = {
script = "doc['location'].arcDistanceInKm($latlon)"
}
}
fields = ["_source"]
}
GXContentBuilder によって生成されたクエリ JSON :
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "5km",
"location": {
"lat": "37.752258",
"lon": "-121.949886"
}
}
}
}
},
"script_fields": {
"distance": {
"script": "doc['location'].arcDistanceInKm(37.752258, -121.949886)"
}
},
"fields": ["_source"]
}
curl-way を使用した JSON クエリは、問題なく動作します。しかし、Groovy コードから実行しようとすると、これ (ElasticSearchService.groovy から取得) を意味します。ここで、リクエストは SearchRequest インスタンスです:
elasticSearchHelper.withElasticSearch { Client client ->
def response = client.search(request).actionGet()
}
次のエラーがスローされます。
Failed to execute phase [dfs], total failure; shardFailures {[1][index][3]: SearchParseException[[index][3]: from[0],size[60]: Parse Failure [Failed to parse source [{"from":0,"size":60,"query_binary":"eyJxdWVyeSI6eyJmaWx0ZXJlZCI6eyJxdWVyeSI6eyJtYXRjaF9hbGwiOnt9fSwiZmlsdGVyIjp7Imdlb19kaXN0YW5jZSI6eyJkaXN0YW5jZSI6IjVrbSIsImNvbXBhbnkuYWRkcmVzcy5sb2NhdGlvbiI6eyJsYXQiOiIzNy43NTIyNTgiLCJsb24iOiItMTIxLjk0OTg4NiJ9fX19fSwic2NyaXB0X2ZpZWxkcyI6eyJkaXN0YW5jZSI6eyJzY3JpcHQiOiJkb2NbJ2NvbXBhbnkuYWRkcmVzcy5sb2NhdGlvbiddLmFyY0Rpc3RhbmNlSW5LbSgzNy43NTIyNTgsIC0xMjEuOTQ5ODg2KSJ9fSwiZmllbGRzIjpbIl9zb3VyY2UiXX0=","explain":true}]]]; nested: QueryParsingException[[index] No query registered for [query]]; }
上記のクロージャーは、使用するfiltered = { ... } script_fields = { ... }
だけで機能しますが、計算された距離は返されません。
誰もが同様の問題を抱えていましたか?
前もって感謝します :)
ここで明白なことを指摘するのは気が進まなかった可能性があります:P