64

配列であり、N 個を超える要素を持つフィールドを持つドキュメントをフィルタリングするにはどうすればよいですか?

空の配列であるフィールドを持つドキュメントをフィルタリングするにはどうすればよいですか?

ファセットは解決策ですか? もしそうなら、どのように?

4

10 に答える 10

64

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
        }
    }
}
于 2013-03-21T13:25:23.097 に答える
17

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

于 2016-02-09T17:42:46.320 に答える
6

スクリプトを使用してサイズで配列をフィルタリングする正しい方法は次のとおりです。

"filter" : {
    "script" : {
        "script" : "_source.fieldName.size() > 1"
    }
}

@javannaが示唆するようにそれを行うと、例外がスローされますgroovy.lang.MissingPropertyException: No such property: length for class: java.lang.String

于 2015-05-25T09:29:13.453 に答える
4

これに基づく: https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/collect/RegularImmutableList.java?r=707f3a276d4ea8e9d53621d137febb00cd2128da

そして、リサックの答えはこちら。

リストの長さを返す size() 関数があります。

"filter" : {
    "script" : {
        "script" : "doc['fieldname'].values.size() > 10"
    }
}
于 2015-05-27T11:16:33.637 に答える