3

これまでのところ、このガイドに従って、ネイティブ Java スクリプトを Elasticsearch で動作させるようにしました。通常のネストされていないフィールドへのアクセスは、 を使用して正常に機能しdoc().field("fieldname")ます。

ネストされたフィールドでも同じことができますか? それらをループしてネストされたフィールドにアクセスするにはどうすればよいですか?

編集:以下の imotov の回答を読んだ後、include_in_rootまたはを使用してルート ドキュメントにネストされたフィールドを含めることになりましたinclude_in_parent( docsを参照)。

GeoPoint[] locations = ((GeoPointDocFieldData)doc().field("places.location")).getValues();

for (GeoPoint location : locations) {
    // Do Stuff
    double lat = location.lat();
    double lon = location.lon();
}
4

1 に答える 1

4

これは厳しいものです。ネストされたオブジェクトは個別のドキュメントとして内部的にインデックス付けされるため、最上位の custom_filters_score はルート オブジェクトで動作し、ネストされたオブジェクトにはアクセスできません。しかし、できることがいくつかあります。

私の意見では、スクリプトがネストされたオブジェクトで実行されるネストされたフィルターに custom_filters_score を移動するのが最善の方法です。例として、エラスティック検索 - タグ付け強度 (ネストされた/子ドキュメントのブースティング)を参照してください。

2 番目のオプションはinclude_in_root、ネストされたオブジェクト マッピングで設定を true に設定することです。このようにして、ネストされたすべてのオブジェクト フィールドがルート オブジェクトでもインデックス化され、ネストされていないかのように、ドット表記を使用してそれらにアクセスできるようになりますplaces.location。このオプションの問題は、フィールドに 2 回インデックスを付ける必要があり、どのネストされたオブジェクトがネストされたクエリに一致したかがわからないことです。

3 番目のオプションは、ネストされたオブジェクト フィールドをソースから取得することです。検索で多くの結果が得られる場合、これは非常に遅くなり、実際には適用できません。

于 2013-04-08T16:40:56.417 に答える