暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用 Nested 解决 Elasticsearch 嵌套字段搜索不准确的问题

Elasticsearch之家 2022-05-12
2330

点击上方“蓝字”,轻松关注我们


每天分享干货文章

概念及适用场景

官方释义:这个nested类型是object[1]一种数据类型,允许对象数组以相互独立的方式进行索引

适用场景:字段值为复杂类型的情况,说人话,就是字段值为 json 兑现的时候。

案例演示

场景:假设我们有一个订单索引:order,其包含了订单名称、商品数量、订单总金额以及订单商品明细等数据

需求:查询订单商品中商品名称为dishwasher并且商品价格为1999的订单信息,尝试执行以下脚本

结果

按照bool中must的查询逻辑,两个条件都符合的数据并不存在,然而执行查询后发现返回以下结果

原因

可以看到上述结果元数据中出现了订单数据,这和预期结果不一致。

分析原因如下:

当字段值为复杂数据类型(Object、Geo-Point等)的时候,ES内部实际是以如下方式保存数据的:

上述例子中goods_list中每个对象元素的属性值被扁平化存储在了数组中,此时已丢失了对应关系,因此无法保证搜索的准确。

解决方案

使用Nested类型

用法

上述问题解决办法即对复杂类型使用Nested类型。在ES中嵌套类型不止Nested一种,但是只有Nested是单独的考点,因此其他的暂不需考虑。

1:创建Mapping在Mapping中为复杂类型指定Nested类型


2:写入数据再次写入数据,此处省去此步骤代码。3:验证结果执行查询,实际为query外层进行了一层嵌套。



超过一百认证工程师均出自于此


你们点点“分享”,给我充点儿电吧~

文章转载自Elasticsearch之家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论