2017-08-22 4 views
0

は以下を使用しますが動作しないことにより、20以上である:elasticsearchクエリ値の長さを持つテキストフィールド20以上の

GET /groups/_search 
{ 
    "query": { 
     "bool" : { 
      "must" : { 
       "script" : { 
        "script" : "_source.name.values.length() > 20" 
       } 
      } 
     } 
    } 
} 

エラーMSG次のとおりです。

{ 
    "error": { 
    "root_cause": [ 
     { 
     "type": "script_exception", 
     "reason": "compile error", 
     "script_stack": [ 
      "_source.name.values.lengt ...", 
      "^---- HERE" 
     ], 
     "script": "_source.name.values.length() > 5", 
     "lang": "painless" 
     } 
    ], 
    "type": "search_phase_execution_exception", 
    "reason": "all shards failed", 
    "phase": "query", 
    "grouped": true, 
    "failed_shards": [ 
     { 
     "shard": 0, 
     "index": "groups", 
     "node": "exBbDVGeToSDRzLLmOh8-g", 
     "reason": { 
      "type": "query_shard_exception", 
      "reason": "failed to create query: {\n \"bool\" : {\n \"must\" : [\n  {\n  \"script\" : {\n   \"script\" : {\n   \"inline\" : \"_source.name.values.length() > 5\",\n   \"lang\" : \"painless\"\n   },\n   \"boost\" : 1.0\n  }\n  }\n ],\n \"disable_coord\" : false,\n \"adjust_pure_negative\" : true,\n \"boost\" : 1.0\n }\n}", 
      "index_uuid": "_VH1OfpdRhmd_UPV7uTNMg", 
      "index": "groups", 
      "caused_by": { 
      "type": "script_exception", 
      "reason": "compile error", 
      "script_stack": [ 
       "_source.name.values.lengt ...", 
       "^---- HERE" 
      ], 
      "script": "_source.name.values.length() > ", 
      "lang": "painless", 
      "caused_by": { 
       "type": "illegal_argument_exception", 
       "reason": "Variable [_source] is not defined." 
      } 
      } 
     } 
     } 
    ] 
    }, 
    "status": 400 
} 

私はそれを修正するべきか全く分からない...

はFYI:ESのバージョンは5.4.0

私は関連の次の問題を知らない: 無痛script_fieldsは、あなたが使用することができます#20068 https://github.com/elastic/elasticsearch/issues/20068

+0

あなたが代わりに '' _source'のctx._source'を試したことがありますか? – Val

+0

ctx._sourceは私にとっては機能しません。 –

+0

GET/china_groups/_search { "クエリ":{ "ブール":{ "必須":{ "スクリプト":{ "スクリプト":「DOC [ '名前'] values.size() > 5 " }} }} } これはあなたの' name'のフィールド内のトークンの数だけフィールド全体の長さを測定しません –

答えて

2

これを処理する最適かつ最適な方法は、nameフィールドの長さを持つ別のフィールドをインデックス化することです。nameLengthとしましょう。そのようにすると、クエリ時に(繰り返し)行うのではなく、インデックス時に名前フィールドの長さを計算する負担がかかります。

のようなフィールドがnameの場合は、インデックス作成時に{"name": "A big brown fox", "nameLength": 15}などの名前フィールドの長さを持つ新しいフィールドを作成します。

問合せ時に、あなたはnameLengthフィールド上で簡単かつ迅速rangeクエリを使用することができますが:

GET /groups/_search 
{ 
    "query": { 
     "bool" : { 
      "must" : { 
       "range" : { 
        "nameLength": { 
         "gt": 20 
        } 
       } 
      } 
     } 
    } 
} 
0

変数_sourceへのアクセスを持っていない:場合

parmas._source.name.length() > 20

を、これはまれですクエリ、それはおそらく大丈夫です。それ以外の場合は、名前の長さにフィールドを追加し、rangeクエリを使用する必要があります。

+0

これは解析された原因名フィールドがテキストの後にトークンの数を返すようです –

+0

あなたはそうです、それについてはごめんなさい!実際に動作するものを編集しました。私は強くあなたが(長さを格納する別のフィールドを使用して)しかし、他の答えを検討することをお勧めします。非常にまれでない限り、ESでスクリプトクエリを使用している場合、データモデルが間違っている可能性があります。 – dshockley

+0

ありがとうございました。あなたが正しいです。私はおそらく私が使用しているモデルを再考する必要があります。 –

関連する問題