elasticsearch - Elasticsearch自定义映射定义

标签 elasticsearch

我必须以以下格式将数据上传到麋鹿:

{
  "location":{
    "timestamp":1522751098000,
    "resources":[
      {
         "resource":{
           "name":"Node1"
          },
          "probability":0.1
      },
      {
        "resource":{
          "name":"Node2"
         },
        "probability":0.01
      }]
  }
}

我正在尝试定义此类数据的映射,并根据以下映射生成了他:
{
 "mappings": {
   "doc": {
     "properties": {
        "location": {
           "properties" : {
              "timestamp": {"type": "date"},
              "resources": []
           }
         }
     }
  }
}

我有两个问题:
  • 如何在映射中定义“资源”数组?
  • 是否可以定义自定义类型(例如资源)并在我的映射中使用此类型(例如“resources”:[{type:resource}])?
  • 最佳答案

    关于Elasticsearch映射,有很多事情要知道。我真的强烈建议您至少阅读一些their documentation

    如果您不在乎,请先简短回答:

  • Elasticsearch自动允许存储一个或多个已定义对象的值,无需指定数组。请参阅标记1或引用其有关array types的文档。
  • 我认为没有。由于Elasticsearch 6,每个索引仅允许使用1种类型。嵌套对象可能是最接近的,但是您可以在同一文件中定义它们。嵌套对象存储在单独的索引中(内部)。


  • 长答案和一些想法

    看一下下面的映射:
    "mappings": {
        "doc": {
            "properties": {
                "location": {
                    "properties": {
                        "timestamp": {
                            "type": "date"
                        },
                        "resources": { [1]
                            "type": "nested", [2]
                            "properties": {
                                "resource": {
                                    "properties": {
                                        "name": { [3]
                                            "type": "text"
                                        }
                                    }
                                },
                                "probability": {
                                    "type": "float"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    

    这就是您的映射的样子。可以以不同的方式进行操作,但是我认为这种方式很有意义-也许除了标记3之外。我现在就来谈谈这些:

    标记1:如果定义一个字段,通常给它一个类型。我将resources定义为nested类型,但是您的timestamp属于date类型。 Elasticsearch自动允许存储这些对象的一个​​或多个值。 timestamp实际上还可以包含dates数组,即no need to specify an array

    标记2:我将resources定义为nested类型,但是它也可以是下面类似resource的对象(其中未提供任何类型)。了解有关嵌套对象here的信息。最后,我不知道您的查询是什么样子,因此不确定您是否真的需要嵌套类型。

    标记3:我想在这里解决两件事。首先,我想再次提及resource被定义为具有name属性的普通object。您也可以为resources执行此操作。

    第二件事更多是发人深省的冲动:如果某些事情绝对不适合您的情况,请不要太当真。只是把它当作一种意见。

    这种映射结构看起来很受关系数据库方法的启发。我认为您通常希望为 flex 搜索定义更多的文档结构,以进行预期的搜索。冗余不是问题,但是嵌套对象会使查询变得复杂。我想我会省略整个资源部分,并做这样的事情:
    "mappings": {
        "doc": {
            "properties": {
                "location": {
                    "properties": {
                        "timestamp": {
                            "type": "date"
                        },
                        "resource": {
                            "properties": {
                                "resourceName": {
                                    "type": "text"
                                }
                                "resourceProbability": {
                                    "type": "float"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    

    因为正如我说的,在这种情况下resource可以包含一个对象数组,每个对象都有一个resourceNameresourceProbability

    关于elasticsearch - Elasticsearch自定义映射定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52744039/

    相关文章:

    elasticsearch:重命名查询的输出字段

    elasticsearch - 通过Ansible或Fig运行docker中的传递参数(例如-Des.node.name =“TestNode”)

    regex - ElasticSearch错误的正则表达式

    具有多个 Elasticsearch 集群的 Spring Boot 启动速度非常慢

    elasticsearch - 带有子聚合的Elasticsearch多选方面功能

    javascript - Elasticsearch 关键词不匹配

    Elasticsearch - 以更高的值(value)提升嵌套查询

    python - 在 Elasticsearch Python DSL 中使用 shingles 和模糊性?

    python - 如何创建嵌套字典,以便通过Python为Elasticsearch创建映射?

    java - Mongodb 中二进制文件的全文搜索