custom_scoreクエリを使用し、null値を含む可能性のあるフィールドに基づいてスコアを付けようとすると、落とし穴があるようです。
私が持っているとすると:
{"user": {"name": "John", "position": null}}
custom_scoreと次のようなスクリプトを使用してクエリを実行すると、次のようになります。
{"script": "_score + doc['position'].value"}
次のエラーが発生します。
ElasticSearchIllegalArgumentException[No field found for [position]]; }]
別のユーザーを追加した場合:
{"user": {"name": "Jane", "position": 1}}
すべてが正常に動作します。
デフォルトの動作は、null値フィールドがnullを返すことであり、エラーを発生させないようにする必要があると思います。
上記の例は不十分に見えるかもしれませんが、データベースからのデータでインデックスを埋めることを想像してください。ここでは、列にnull値以外のものが含まれないという保証はありません。 マッピングを使用してフィールドを文字列に型キャストすることでこれを回避できますが、ElasticSearchがスクリプト値をよりインテリジェントに処理できることを強くお勧めします。
ああ-そして素晴らしい製品をありがとう! :-)
やあ、
これは、そのフィールドがまだ導入されていないために発生します(null値があります)。 クラスターに(単一の値で)導入されると、正常に機能します。 そのフィールドがnull
である場合に、特定のnull値にインデックスを付けるマッピングでnull-value
を定義することもできます。 導入されていないため、その型を導出することはできません。
はい、わかりました。 例外を発生させて結果が返されないようにするのではなく、スクリプト値がnullを返すか、少なくともその存在をチェックするための何らかの関数を使用する方がよいのではないでしょうか。
例えば:
{"script": "_score + (doc['position'].present ? doc['position'] : 0)"}
これは機能するはずです:
{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}
または多分これさえ:
{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}
それでも、十分なデータセットがあり、少なくとも1つのドキュメントの各シャードの値がposition
である場合、このチェックは必要ありません。そうすれば、スクリプトのパフォーマンスが大幅に向上します。
致命的なエラー:キャッチされていません[NoFieldFound]フィールドが見つかりません:Contact._PloiciesLastApplicationDate0試行されました:1回。 投げられる
連絡先の更新中に次のエラーが発生します。
$ checkExist = Infusionsoft_DataService :: query(new Infusionsoft_Contact()、array('Phone1' =>'(618)-795-0304'));
連絡先を取得し、電話番号に基づいて連絡先を更新していますが、このエラーが発生しますか?
ありがとう!
最も参考になるコメント
これは機能するはずです:
または多分これさえ:
それでも、十分なデータセットがあり、少なくとも1つのドキュメントの各シャードの値が
position
である場合、このチェックは必要ありません。そうすれば、スクリプトのパフォーマンスが大幅に向上します。