弹性搜索:地图 属性 类型使用通配符作为 属性 名称

Elastic search: map property types using wildcard for property name

我想对所有属性应用映射。我可以在不命名 属性.

的情况下这样做吗

例如

'body' => [
    'doc_type' =>
        'properties' =>
            'networks' =>
                'properties' => [
                    '*' => ['type' => 'integer']
                ]
            ]
        ]
    ]
]

而不是:

'properties' => [
    'vip10415' => ['type' => 'integer'],
    'vip86485' => ['type' => 'integer'],
    'vip23465' => ['type' => 'integer'],
    'vip97949' => ['type' => 'integer']
    ....
 ]

我想这样做的原因是直到运行时才知道将使用哪些属性。

我知道查询可以有通配符,但还没有看到映射是否可以。我查看了动态映射,但它不是这样工作的。

更新:

我试过插入整数并让 elastic 推断它们的类型,但它将它们解析为类型 'long'。我正在使用 php 插入并确保它们是具有 intval() 函数的整数。

更新:

'properties'实际上是嵌套属性'Networks'的子字段。要存储为 int 的 属性 的名称直到运行时才会知道。

更新:

我尝试在 doc_type 中应用@bittusarkar 推荐的动态映射模板,但它抛出了无法解析映射的异常。

"dynamic_templates" => [
    "integers" => [
        "match_mapping_type" => "long",
        "mapping" => [
            "type" => "integer"
        ]
    ]
]

使用 Dynamic Templates:

PUT /my_index
{
 "mappings": {
  "my_type": {
     "dynamic_templates": [
        {
           "analysed_string_template": {
              "match": "*",
              "mapping": {
                 "type": "integer"
              }
             }
          }
        ]
     }
    }
 }

here

学习更多

如果这些字段实际上是整数类型,您甚至不需要在映射中显式定义它们。只需拥有一个空映射并开始使用这些字段索引文档。 Elasticsearch 可以推断字段类型并动态更新映射。您所要求的也可以通过动态模板来实现,但在我看来,这太过分了。

既然您希望类型为 integer 而不是默认的 long,那么 dynamic templates 就是答案。请参阅下面的映射定义。它将检测到类型为 long 的任何字段的类型转换为类型 integer.

{
    "mappings": {
        "mapping_name": {
            "dynamic_templates": [
                {
                    "convertToInteger": {
                        "match_mapping_type": "long",
                        "mapping": {
                            "type": "integer"
                        }
                    }
                }
            ]
        }
    }
}