2012-05-27 10 views
6

:、私は一致しようとしている代わりにElasticsearch QueryBuilder一致する複数の利用規約次の形式でES指数でJSONを考える

client.prepareSearch("index_name") 
     .setTypes("pin") 
     .setQuery(QueryBuilders.termQuery("id", 123)) 
     .execute() 
     .actionGet(); 

{ 
    "pin": { 
     "id": 123, 
     "location": { 
      "lat": 456, 
      "lon":-789 
     } 
    } 
} 

次はidフィールドに一致する文書を取得します複数のフィールド、すなわち。 (location.lat,location.lon)。例えば、

QueryBuilders.termQuery(); // accepts only a single term 

は、いくつかの選択肢を試みたが、それがどれも動いていないようにみえ:

QueryBuilder queryBuilder = QueryBuilders.boolQuery() 
     .must(QueryBuilders.termQuery("location.lat", 456)) 
     .must(QueryBuilders.termQuery("location.lon", -789)); 

client.prepareSearch("index_name") 
     .setTypes("pin") 
     .setQuery(queryBuilder) 
     .execute() 
     .actionGet(); 
+0

のQueryBuilders.multiMatchQueryを使用することができますがgeo_pointとしてインデックスの場所ですか? – imotov

+0

はい、 'geo_point'としてマップされます。 – ahmedyha

答えて

4

デフォルトでは、geo_pointフィールドは2つのフィールド(location.latとlocation.lon)としてインデックス付けされません。緯度と経度の両方を含む単一のフィールドとしてインデックスされます。

lat_lonmapping optionをオンにすると、緯度と経度のインデックス設定をオンにすることができます。しかし、あなたの例では、緯度と経度の値が大きすぎます。したがって、正規化され、倍精度に変換され、456および-789の代わりに-84.0および-69.0として索引付けされます。したがって、lat_lonを有効にしてクエリの値を置き換えると、結果を取得できるはずです。

インデックス作成前に緯度と経度の値がdoubleに変換されることに注意してください。長期クエリーを使用すると、丸め誤差を常に考慮する必要があるため、長期的にはあまり実用的でないかもしれません。代わりにrange queriesまたはelasticsearch geospatial queriesを使用すると便利です。

1

はElasticSearchでbool queryをチェックアウト、あなたは適切な混合物を得るためにmustshouldまたはshould_notを指定することができるはずですあなたの質問に答えてください。

+1

私はこれが上記のコードスニペットであると思います。 – ahmedyha

0

あなたが代わりにQueryBuilders.termQuery

関連する問題