2013-03-21 7 views

答えて

36

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 
     } 
    } 
} 
+0

フィールドが文字列で配列でない場合は、これを行う方法を知っていますか? –

+1

私は同じ問題を抱えていますが、フィールドは配列ですが、ESは文字列としてそれを見ていますが、 'groovy.lang.MissingPropertyException:No such property:クラスの長さ:java.lang.String' – lisak

+0

@lisakこれを試してください:" script ":" doc ['fieldname']。size()> 50 " –

6

スクリプトを使ってサイズによるフィルタリングアレイの正しい方法私見:長さが一定であれば、スクリプトが、それは常に同じなので、elasticsearchによってキャッシュされ、再利用されるように、私はparamsセクションに入れたいです次のとおりです。

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

私は@javannaが示唆するように、それはこのことに基づいて例外groovy.lang.MissingPropertyException: No such property: length for class: java.lang.String

+2

ソースはdocよりずっと遅く、ディスクにヒットします。 – whitfin

+0

また、 'fieldName'を使ったことと、' fieldname'を使ったことに注意してください。 – whitfin

+1

その理由は、 'Groovy'が配列と文字列の両方に対して' size() 'を提供するからです。 _all_の値が配列でない場合は、存在しないString上で_property_の長さを使用しようとしているため、実行した問題が発生します。 – pickypg

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

2

最も簡単な方法は、カウントを含むプロパティと存在する場合はブール値を持つようにデータを「非正規化」することです。次に、これらのプロパティを検索するだけです。例えば

{ 
    "id": 31939, 
    "hasAttachments": true, 
    "attachmentCount": 2, 
    "attachments": [ 
     { 
     "type": "Attachment", 
     "name": "txt.txt", 
     "mimeType": "text/plain" 
     }, 
     { 
     "type": "Inline", 
     "name": "jpg.jpg", 
     "mimeType": "image/jpeg" 
     } 
    ] 
} 
1

はまだ私と同じような状況を立ち往生人のために、ここに投稿します。 のは、あなたのデータは次のようになりましょう:

{ 
    "_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ようです。

関連する問題