9

次の形式のESインデックスでJSONを指定します。

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

id以下は、フィールドに一致するドキュメントを取得します。

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

代わりに、私は複数のフィールドを一致させようとしています。(location.latlocation.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();
4

4 に答える 4

4

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

lat_lon マッピングオプションをオンにすると、緯度と経度のインデックスをオンにできます。ただし、この例では、緯度と経度の値が大きすぎます。したがって、それらは正規化され、doubleに変換され、456および-789ではなく-84.0および-69.0としてインデックス付けされます。したがって、lat_lonクエリの値を有効にして置き換えると、結果を取得できるはずです。

緯度と経度の値は、インデックスを作成する前にdoubleに変換されることに注意してください。したがって、用語クエリの使用は、丸め誤差を常に考慮に入れる必要があるため、長期的にはあまり実用的ではない可能性があります。代わりに、範囲クエリまたはelasticsearch地理空間クエリを使用する方が便利な場合があります。

于 2012-05-29T16:05:41.630 に答える
1

ElasticSearchでboolクエリを確認してください。クエリを指定するかmust、クエリのおよび/またはクエリの適切な組み合わせを取得できるはずです。shouldshould_not

于 2012-05-28T02:30:42.107 に答える
0
QueryBuilder qb = boolQuery()
    .must(termsQuery("content", Arrays.asList("test1", "test4"))); 

https://www.elastic.co/guide/en/elasticsearch/guide/current/_finding_multiple_exact_values.html

于 2017-07-24T11:00:26.997 に答える
-1

QueryBuilders.termQueryの代わりにQueryBuilders.multiMatchQueryを使用できます

于 2015-02-10T21:57:49.407 に答える