配列であり、N 個を超える要素を持つフィールドを持つドキュメントをフィルタリングするにはどうすればよいですか?
空の配列であるフィールドを持つドキュメントをフィルタリングするにはどうすればよいですか?
ファセットは解決策ですか? もしそうなら、どのように?
配列であり、N 個を超える要素を持つフィールドを持つドキュメントをフィルタリングするにはどうすればよいですか?
空の配列であるフィールドを持つドキュメントをフィルタリングするにはどうすればよいですか?
ファセットは解決策ですか? もしそうなら、どのように?
script filterを見てみましょう。fieldname
次のフィルターは、配列であるフィールドに少なくとも 10 個の要素を持つドキュメントのみを返す必要があります。インデックスに含まれるドキュメントの数によっては、コストが高くなる可能性があることに注意してください。
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > 10"
}
}
2 番目の質問について: 本当にそこに空の配列がありますか? それとも、値のない単なる配列フィールドですか? 不足しているフィルターを使用して、特定のフィールドに値がないドキュメントを取得できます。
"filter" : {
"missing" : { "field" : "user" }
}
それ以外の場合は、上記で提案したのと同様に、入力としての長さが異なるだけで、スクリプトを再度使用する必要があると思います。params
長さが一定の場合、スクリプトがelasticsearchによってキャッシュされて再利用されるように、セクションに入れます。これは常に同じであるためです。
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > params.param1"
"params" : {
"param1" : 10
}
}
}
javana の答えは、Elasticsearch 1.3.x 以前では正しいです。1.4 以降、デフォルトのスクリプト モジュールがgroovy (以前はmvel ) に変更されました。
OPの質問に答える。
Elasticsearch 1.3.x 以前では、次のコードを使用します。
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > 10"
}
}
Elasticsearch 1.4.x 以降では、次のコードを使用します。
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.size() > 10"
}
}
さらに、Elasticsearch 1.4.3 以降では、セキュリティ上の問題により、動的スクリプトがデフォルトで無効になっているため、動的スクリプトを有効にする必要があります。参照: https://www.elastic.co/guide/en/elasticsearch/reference/1.4/modules-scripting.html
スクリプトを使用してサイズで配列をフィルタリングする正しい方法は次のとおりです。
"filter" : {
"script" : {
"script" : "_source.fieldName.size() > 1"
}
}
@javannaが示唆するようにそれを行うと、例外がスローされますgroovy.lang.MissingPropertyException: No such property: length for class: java.lang.String
そして、リサックの答えはこちら。
リストの長さを返す size() 関数があります。
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.size() > 10"
}
}