当前位置:   article > 正文

elasticsearch嵌套对象的映射

es嵌套对象通过注解映射

    在es中,我们有时候可能需要映射,{ "field" : "xx" , "field01" : [] }这样格式的嵌套对象,默认情况下es会将field01的type映射成object类型,这个时候,我们去查询可能就会出现问题。需要手动修改成nested嵌套类。型。

一、有问题的情形演示。

1、插入数据,es默认会自动创建映射

  1. curl -XPUT "http://192.168.99.1:9200/nestedindex/personinfo/1" -d'
  2. {
  3. "name" : "my name is zhangsa",
  4. "address" : [
  5. {
  6. "city" : "china hubei",
  7. "zipcode" : "123456"
  8. },
  9. {
  10. "city" : "china huanggang",
  11. "zipcode" : "654321"
  12. }
  13. ]
  14. }'

 2、查询name字段中必须要出现name这个值,且address.city的值是"huanggang",address.zipcode的值是123456,这个时候应该查询不出来数据,可是查询的结果如下。
    注意这样可以查询出来是因为底层的存储格式被扁平化成下方这种格式了

               address.city=["china", "hubei","huanggang"]

               address.zipcode=["123456","64321"]

               那么city和zipcode之间的关联关系就打乱了。


 二、正确的做法

1、创建索引的时候,手动指定address的type为nested

  1. curl -XPUT "http://192.168.99.1:9200/nestedindex" -d'
  2. {
  3. "mappings": {
  4. "personinfo" : {
  5. "properties": {
  6. "name" : {
  7. "type": "text"
  8. },
  9. "address" : {
  10. "type": "nested",
  11. "properties": {
  12. "city" : {
  13. "type" : "text"
  14. },
  15. "zipcode" : { "type" : "keyword" }
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }'

 2、插入数据

  1. curl -XPUT "http://192.168.99.1:9200/nestedindex/personinfo/1" -d'
  2. {
  3. "name" : "my name is zhangsa",
  4. "address" : [
  5. {
  6. "city" : "china hubei",
  7. "zipcode" : "123456"
  8. },
  9. {
  10. "city" : "china huanggang",
  11. "zipcode" : "654321"
  12. }
  13. ]
  14. }'

 3、查询name字段中必须要出现name这个值,且address.city的值是"huanggang",address.zipcode的值是123456,应该查询不出来结果,就是正确的。
    注意嵌套对象会被索引成分离的隐藏文档,不能直接查询它们。而是需要使用nested查询或nested过滤器来查询它们。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/615802
推荐阅读
相关标签
  

闽ICP备14008679号