我有一份给定的文件:
{
"foo": {}
}
其中foo
可以包含任意数量的属性。假设我将数百万个文档导入到我的索引中,其中每个foo
的属性都有其他值。
这意味着我将动态构建的映射将变得非常庞大。有什么方法我可以告诉弹性搜索类似
在索引文档之前,我是否必须自己照顾?取出
foo
中的所有内容,然后只接受它(或字符串化foo
),而不会产生百万行映射???
如果是的话,我认为有2个解决方案
JSON.stringify
foo
将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或2,为什么?
感谢您的帮助!
答案 0 :(得分:4)
您无法让Elasticsearch为您进行字符串化。你可以忽略“foo”下的任何内容,它将成为“_source”的一部分,但它根本不会被搜索。
第二种方法可以很有意义,具体取决于您将如何查询它,以及您可以了解的有关您将接受的各种值的信息。
Dynamic Type with Mappings处有一个相关的问题,描述了这种方法,这里有一个可运行的示例:https://www.found.no/play/gist/7596633
我们的想法是每个值都有一个嵌套文档。如果每个文档的值的数量不是很大,这很有效。如果您不使用嵌套文档,则在搜索“key”时将返回您的文档:“bar1”和“value”:“bar2的值”。