ES 6.x,联接类型,当父文档和子文档具有相同的字段时。将其存储为一两个字段?

时间:2019-09-03 11:50:27

标签: elasticsearch

我们知道,ES6.x将父类型和子类型存储在一种文档中。

我的模特是:

parent: {id, name, point}
child:  {id, point}

设计文件有什么建议?

{id, name, point} or {id, name, point, child_point}

问题是:当父母和孩子的字段名称相同时,我应该将其存储在一个或两个字段中吗?

1 个答案:

答案 0 :(得分:0)

我相信您可以双向使用。哪一个取决于您要针对父文档和子文档执行哪种查询。

如果您重复使用字段名

比方说,您使name重用了字段名。

您可以通过name查询所有文档-父文档将与子文档一起返回。这可能是不可取的(或可能不是,取决于您想要的)。

为了仅按名称查询父文档或子文档,您仍然可以像这样使用mustname: X AND type: parent(或孩子)。

如果重用text字段,则相关性评分可能会受到影响-因为具有相同名称的字段将使用相同的倒排索引,并且parent令牌频率将影响{{1} }文字搜索。

如果您不重复使用字段名

比方说,您决定父文档仅填充“父域”,子文档-仅决定“子域”。例如,在父母中,您将使用child;在孩子中,您将使用name

在这种情况下,仅按名称搜索父文档,使用一个查询childName就足够了。要按名称搜索子文档:name: X

如果您需要混合结果(父文档和子文档在同一结果集中),您仍然可以通过should组合这两个查询。

用于父级childName: X的全文本搜索的索引不会影响name中的那个。

那么,该选择哪一个?

childNamehas_child查询似乎不会影响选择,因为它们会自动区分父级和子级。

如果您执行许多以相同方式查询父文档和子文档的查询,请选择字段的重用。

否则,请勿重复使用字段名称。

希望有帮助!