【问题标题】:Handling unexpected array/object in string field - ElasticSearch处理字符串字段中的意外数组/对象 - ElasticSearch
【发布时间】:2021-05-25 13:03:06
【问题描述】:

让 ElasticSearch 处理日志非常棒。 但是拥有一个为同一字段发送不同数据类型的程序并没有那么多......

例如:

一个查询可能是

send('id' => '123')

还有一个

send('id' => ['123']) 

第二次发送将失败,因为即使使用 ignore_malformed: true(字段类型设置为文本),Elastic 也会拒绝它。

对象也会发生同样的情况

有没有其他方法可以为字段提供更动态的值设置?

或者我应该只是通过代码并更改所有查询...

【问题讨论】:

    标签: php elasticsearch logging


    【解决方案1】:

    在 elasticsearch 中没有为 array 值定义的特定数据类型。您只需要确保数组值包含相同类型的值即可。

    添加一个带有索引映射和数据的工作示例

    索引映射:

    {
      "mappings": {
        "properties": {
          "id": {
            "type": "text"
          }
        }
      }
    }
    

    索引数据 1:

    {
      "id": "123"
    }
    

    索引数据 2:

    {
      "id": [
        "123",
        "56"
      ]
    }
    

    这两个文档都将被成功索引,无一例外

    编辑 1:

    如果您只是希望文档被索引(而不是搜索),那么您可以将id 类型设置为带有"enabled": false 的对象。这将索引所有格式的数据(文本、数组、对象)

    {
      "mappings": {
        "properties": {
          "id": {
            "type": "object",
            "enabled": false
          }
        }
      }
    }
    

    以下文档将使用上述映射进行索引

    对象类型:

    {
      "id": {
        "age": 50,
        "name": {
          "first": "John"
        }
      }
    }
    

    数组类型:

    {
      "id": [
        "123",
        "56"
      ]
    }
    

    字符串类型:

    {
      "id": "123"
    }
    

    【讨论】:

    • 感谢您的回复。但是我如何处理带有 KVP ('idNum' => "123") 的数组呢?如果 Object 来代替数组怎么办?
    • @lucian24 你可以试试相反的方法。请浏览答案的更新部分
    • 这可以解决所有问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2023-03-28
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多