我有一个用例,其中有一组预定义的字段,并且还需要支持向ElasticSearch添加动态字段并对其进行一些基本搜索。我可以使用动态模板映射来实现。但是,添加这样的动态场的频率很高。
考虑此ES文档的事件类型:
{
"name":"Youth Conference",
"venue":"Ahmedabad",
"date":"10/01/2015",
"organizer":"Invincible",
"extensions":{
"about": {
"vision":"Visualizes the image of an ideal Country. ",
"mission":"Encapsulates the gravity of the top reformative solutions for betterment of Country."
}
// Any thing can go here..
}
}
在上面的示例中,每个事件文档可以具有任何未知/新字段。因此,对于引入的每个此类新动态字段,ES将更新类型的映射。我担心的是在现有类型中添加新字段映射的成本是多少?
我计划通过引入另一种类型来表示所有动态映射(在事件类型内)和事件类型,例如 EventExtensions ,并使用父/子关系将其与事件类型进行映射。我相信这可能会限制向类型中频繁添加动态字段的成本(如果有)。但是,据我所知,使用父子关系将需要更多的内存。
最佳答案
这里要记住的第一件事是字段是按索引而不是按类型的。
因此,无论您在何处添加新字段,都将在同一索引中进行。可以是其他类型,也可以是 parent 或 child 。
因此,将新字段解耦到另一种类型,但是相同的索引不会进行任何更改。
第二场加法不是那么昂贵。我知道人们使用1000个字段并且对此很满意。话虽这么说,应该在字段数上有一个标签,这样它就不会出现疯狂的数字。
这里我们有多种解决问题的方法
1)假设不需要精确搜索新字段数据。在这种情况下,您可以将整个JSON反序列化为字符串并将其添加到字段中。另外,请确保未对该字段进行索引。这样,您可以基于其他字段进行搜索,但是随后在检索文档时,可以获得反序列化的信息。
2)假设新字段如下所示
{
"newInfo1" : "log Of Info",
"newInfo2" : "A lot more info"
}
代替这个,你可以使用
{
"newInfo" : [
{
"fieldName" : "newInfo1",
"fieldValue" : "log Of Info"
},
{
"fieldName" : "newInfo2",
"fieldValue" : "A lot more info"
}
]
}
这样,字段将不会增加。但是随后要进行特定于字段级别的搜索,例如给我所有具有filedName作为newInfo2的文档,并在其中添加更多单词,则需要将newInfo字段嵌套到中。
希望这可以帮助。
关于elasticsearch - 在Elasticsearch类型中添加字段映射的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27644821/