我想将映射应用于所有属性。我可以在不命名财产的情况下这样做。
e.g。
'body' => [
'doc_type' =>
'properties' =>
'networks' =>
'properties' => [
'*' => ['type' => 'integer']
]
]
]
]
]
而不是:
'properties' => [
'vip10415' => ['type' => 'integer'],
'vip86485' => ['type' => 'integer'],
'vip23465' => ['type' => 'integer'],
'vip97949' => ['type' => 'integer']
....
]
我想这样做的原因是因为直到运行时才会知道将使用哪些属性。
我知道查询可以有通配符,但是没有看到映射是否可以。我查看了动态映射,但它没有像这样工作。
更新
我尝试插入整数并让弹性推断它们的类型,但它将它们解析为'long'类型。我使用php插入并确保它们与intval()函数一起使用。
更新
'properties'实际上是嵌套属性'Networks'的子字段。在运行时之前,将不知道要存储为int的属性的名称。
更新
我已尝试在doc_type中应用@bittusarkar推荐的动态映射模板,但它会抛出无法解析的映射异常。
"dynamic_templates" => [
"integers" => [
"match_mapping_type" => "long",
"mapping" => [
"type" => "integer"
]
]
]
答案 0 :(得分:1)
使用Dynamic Templates
:
PUT /my_index
{
"mappings": {
"my_type": {
"dynamic_templates": [
{
"analysed_string_template": {
"match": "*",
"mapping": {
"type": "integer"
}
}
}
]
}
}
}
在here
了解更多信息答案 1 :(得分:1)
如果这些字段实际上是整数类型,您甚至不需要在映射中明确定义它们。只需要一个空映射并开始使用这些字段索引文档。 Elasticsearch可以推断字段的类型并动态更新映射。你问的问题也可以通过动态模板来实现,但IMO可能会有点过头了。
由于您希望类型为integer
而不是默认long
,因此dynamic templates就是答案。请参阅下面的映射定义。它会将检测到类型为long
的任何字段的类型转换为integer
类型。
{
"mappings": {
"mapping_name": {
"dynamic_templates": [
{
"convertToInteger": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
}
]
}
}
}