2013-11-28 123 views
5

具有属性的任意数量的对象我有一个给定的文档:映射在elasticsearch

{ 
    "foo": {} 
} 

foo其中可具有的任意属性的量。让我们假设我将导入数百万个文件到我的索引中,其中foo的每个属性都有其他值。

这意味着我将动态构建的映射将变得非常庞大。有没有一种方式,我可以告诉elasticsearch像

带你在foo,只是接受它,因为它是一切(或字符串化foo),而无需导致百万行映射???

还是在编制索引文件之前我必须自己照顾?

如果如此,有一个2的解决方案,我认为

  1. JSON.stringifyfoo

  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" 
          } 
         } 
         } 
        } 
        } 
    } 
    

你愿意然后解决方案1 ​​o 2,为什么?

感谢您的帮助!

回答

3

您无法使Elasticsearch为您进行字符串化。你可以忽略“foo”中的所有内容,它将成为“_source”的一部分,但是它根本无法被搜索到。

第二种方法可以有很大的意义,取决于你将如何查询它,以及你可以知道你将接受的值的种类。

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

的想法是,你必须每值一个嵌套的文件。如果每个文档的值数量不是很大,那么效果很好。如果您不使用嵌套文档,则在搜索“key”时会返回文档:“bar1”和“value”:“bar2的值”。

+0

感谢您的回答。我如何忽略它?如果我这样做,我不能在该字段上搜索,但是当我检索这个对象时它仍然是文档的一部分? – hereandnow78

+1

发现它:{“enabled”:“false”,“type”:“object”},无论如何,非常感谢您的帮助! – hereandnow78