Elasticsearch: custom_score 查询中的空值字段导致“无字段”错误

创建于 2011-02-09  ·  5评论  ·  资料来源: elastic/elasticsearch

使用 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 能够更智能地处理脚本值。

最有用的评论

这应该有效:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

甚至可能是这样:

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

即便如此,如果有足够的数据集,其中每个分片上至少有一个 doc 的值为position ,您应该不需要此检查,然后您的脚本的性能会好得多。

所有5条评论

哦-感谢您提供了很棒的产品! :-)

嘿嘿,

发生这种情况是因为尚未引入该字段(它具有空值)。 一旦它被引入(使用单个值,进入集群),它就会正常工作。 您还可以在映射中定义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'));

我正在获取联系人并根据电话号码更新联系人,但它给出了这个错误?

谢谢!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

clintongormley picture clintongormley  ·  3评论

jasontedor picture jasontedor  ·  3评论

dadoonet picture dadoonet  ·  3评论

brwe picture brwe  ·  3评论

rjernst picture rjernst  ·  3评论