在elasticsearch中映射具有任意数量属性的对象

时间:2013-11-28 11:34:14

标签: elasticsearch

我有一份给定的文件:

{
  "foo": {}
}

其中foo可以包含任意数量的属性。假设我将数百万个文档导入到我的索引中,其中每个foo的属性都有其他值。

这意味着我将动态构建的映射将变得非常庞大。有什么方法我可以告诉弹性搜索类似

  

取出foo中的所有内容,然后只接受它(或字符串化foo),而不会产生百万行映射???

在索引文档之前,我是否必须自己照顾?

如果是的话,我认为有2个解决方案

  1. JSON.stringify foo

  2. foo中的每个属性映射到键/值对,并创建一个对象数组:

    // object
    {
      "foo": [
        {"key": "bar1", "value": "bar1's value"},
        {"key": "bar2", "value": "bar2's value"}
      ]
    }
    
    // resulting mapping
    {
      "type": {
        "properties": {
          "foo": {
            "properties": {
              "key": {
                "type": "string" 
              },
              "value": {
                "type": "string" 
              }
            }
          }
        }
      }   
    }
    
  3. 你更喜欢解决方案1或2,为什么?

    感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

您无法让Elasticsearch为您进行字符串化。你可以忽略“foo”下的任何内容,它将成为“_source”的一部分,但它根本不会被搜索。

第二种方法可以很有意义,具体取决于您将如何查询它,以及您可以了解的有关您将接受的各种值的信息。

Dynamic Type with Mappings处有一个相关的问题,描述了这种方法,这里有一个可运行的示例:https://www.found.no/play/gist/7596633

我们的想法是每个值都有一个嵌套文档。如果每个文档的值的数量不是很大,这很有效。如果您不使用嵌套文档,则在搜索“key”时将返回您的文档:“bar1”和“value”:“bar2的值”。