使用 custom_score 查询并尝试根据可能包含空值的字段进行评分时,似乎有一个陷阱。
鉴于我有:
{"user": {"name": "John", "position": null}}
当我使用 custom_score 和如下脚本进行查询时:
{"script": "_score + doc['position'].value"}
我收到以下错误:
ElasticSearchIllegalArgumentException[No field found for [position]]; }]
如果我添加另一个用户:
{"user": {"name": "Jane", "position": 1}}
一切正常。
我认为默认行为应该是让空值字段返回 null - 而不是引发错误。
上面的示例可能看起来很蹩脚,但想象一下用数据库中的数据填充索引,其中不能保证列不包含空值以外的任何内容。 您可以通过使用映射将字段类型转换为字符串来解决此问题,但我绝对建议 ElasticSearch 能够更智能地处理脚本值。
哦-感谢您提供了很棒的产品! :-)
嘿嘿,
发生这种情况是因为尚未引入该字段(它具有空值)。 一旦它被引入(使用单个值,进入集群),它就会正常工作。 您还可以在映射中定义null-value
,当该字段为null
时,该映射将索引特定的空值。 由于没有引入,所以无法导出其类型。
是的,我明白这一点。 脚本值返回 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)"}
即便如此,如果有足够的数据集,其中每个分片上至少有一个 doc 的值为position
,您应该不需要此检查,然后您的脚本的性能会好得多。
致命错误:未捕获 [NoFieldFound] 未找到字段:Contact._PloiciesLastApplicationDate0 尝试:1 次。 抛出
更新联系人时出现以下错误。
$checkExist = Infusionsoft_DataService::query(new Infusionsoft_Contact(), array('Phone1' => '(618)-795-0304'));
我正在获取联系人并根据电话号码更新联系人,但它给出了这个错误?
谢谢!
最有用的评论
这应该有效:
甚至可能是这样:
即便如此,如果有足够的数据集,其中每个分片上至少有一个 doc 的值为
position
,您应该不需要此检查,然后您的脚本的性能会好得多。