フィールドが配列でN個以上の要素を持つドキュメントをフィルタするにはどうすればよいですか?elasticsearchを配列フィールドのサイズでフィルタリングする
フィールドが空の配列を持つドキュメントをフィルタするにはどうすればよいですか?
ファセットは解決策ですか?もしそうなら、どうですか?
フィールドが配列でN個以上の要素を持つドキュメントをフィルタするにはどうすればよいですか?elasticsearchを配列フィールドのサイズでフィルタリングする
フィールドが空の配列を持つドキュメントをフィルタするにはどうすればよいですか?
ファセットは解決策ですか?もしそうなら、どうですか?
script filterをご覧ください。次のフィルタは、配列であるfieldname
フィールドに少なくとも10個の要素を持つドキュメントのみを返す必要があります。インデックスに登録するドキュメントの数に応じて、これは高価になる可能性があることに注意してください。
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > 10"
}
}
2番目の質問について:本当に空の配列がありますか?それとも、値のない配列フィールドですか?そうでなければ、私はあなただけの入力など、さまざまな長さで、同様に私が上記提案したものに、もう一度スクリプトを使用する必要があると思います
"filter" : {
"missing" : { "field" : "user" }
}
:あなたは、特定のフィールドに値を持たない文書を取得するためにmissing filterを使用することができます。
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > param1"
"params" : {
"param1" : 10
}
}
}
スクリプトを使ってサイズによるフィルタリングアレイの正しい方法私見:長さが一定であれば、スクリプトが、それは常に同じなので、elasticsearchによってキャッシュされ、再利用されるように、私はparams
セクションに入れたいです次のとおりです。
"filter" : {
"script" : {
"script" : "_source.fieldName.size() > 1"
}
}
私は@javannaが示唆するように、それはこのことに基づいて例外groovy.lang.MissingPropertyException: No such property: length for class: java.lang.String
をスローすることを行う場合は、次の https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/collect/RegularImmutableList.java?r=707f3a276d4ea8e9d53621d137febb00cd2128da
そして、リサックの答えはこちら。
リストの長さを返すサイズ()関数があります:
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.size() > 10"
}
}
javannaの答えは(mvelだった)1.4以降デフォルトのスクリプトモジュールがgroovyに変更されている、Elasticsearch 1.3.xを以前の上で正しいです。
OPの質問にお答えします。 Elasticsearch用の1.3.xと以前に
、このコードを使用:Elasticsearchの1.4.xの上
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.length > 10"
}
}
を以降では、このコードを使用:Elasticsearch 1.4.3に、さらに
"filter" : {
"script" : {
"script" : "doc['fieldname'].values.size() > 10"
}
}
およびセキュリティの問題のため、デフォルトで無効になっているので、後で動的スクリプトを有効にする必要があります。参照:https://www.elastic.co/guide/en/elasticsearch/reference/1.4/modules-scripting.html
最も簡単な方法は、カウントを含むプロパティと存在する場合はブール値を持つようにデータを「非正規化」することです。次に、これらのプロパティを検索するだけです。例えば
:
{
"id": 31939,
"hasAttachments": true,
"attachmentCount": 2,
"attachments": [
{
"type": "Attachment",
"name": "txt.txt",
"mimeType": "text/plain"
},
{
"type": "Inline",
"name": "jpg.jpg",
"mimeType": "image/jpeg"
}
]
}
はまだ私と同じような状況を立ち往生人のために、ここに投稿します。 のは、あなたのデータは次のようになりましょう:
{
"_source": {
"fieldName" : [
{
"f1": "value 11",
"f2": "value 21"
},
{
"f1": "value 12",
"f2": "value 22"
}
]
}
}
そして、例えば長さ> 1でfieldName
をフィルタリングする:
"query": {
"bool" : {
"must" : {
"script" : {
"script" : {
"inline": "doc['fieldName.f1'].values.length > 1",
"lang": "painless"
}
}
}
}
}
スクリプトの構文は、ES 5.4のドキュメントhttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-script-query.htmlようです。
フィールドが文字列で配列でない場合は、これを行う方法を知っていますか? –
私は同じ問題を抱えていますが、フィールドは配列ですが、ESは文字列としてそれを見ていますが、 'groovy.lang.MissingPropertyException:No such property:クラスの長さ:java.lang.String' – lisak
@lisakこれを試してください:" script ":" doc ['fieldname']。size()> 50 " –