0

我有一个大型 JSON,其中包含许多包含数组的字段。假设一个字段是“Top”,其中包含许多字段:“Middle1”、“Middle2”、“Middle3”。这些“中间”字段中的每一个都包含一个数组。是否有任何简单的方法可以仅在 Middle1 中搜索每个元素并返回单个元素?当我在匹配的查询中尝试 "Middle1.description":"blahblahblah" 时,elasticsearch 会返回所有 Middle1。我还尝试将弹性搜索的默认映射更改为嵌套,它告诉我:

[object mapping [Middle1] can't be changed from non-nested to nested]

我在这里不知所措。

此外,如果 ES 可以搜索所有这些数组并返回匹配的单个元素,那就太棒了。

4

2 回答 2

2

您只能对映射进行向后兼容的更改。这就是为什么在尝试将对象的类型更改为嵌套时会返回该错误的原因。在实际索引任何文档之前,您应该重新索引您的文档并预先创建嵌套类型。您可以在创建索引时通过create index api提交映射,也可以在之后使用put mapping api更新它。

即使使用嵌套文档,您也总是会取回您索引的整个文档。嵌套类型允许区分不同的孩子并返回属于同一个孩子的正确匹配。这在映射一对多关系并且您同时对子项进行多个查询时很有用。请查看以下文章以了解更多信息:

http://euphonious-intuition.com/2013/02/managing-relations-in-elasticsearch/ http://www.spacevatican.org/2012/6/3/fun-with-elasticsearch-s-children-and-嵌套文档/

正如文章中提到的,父/子是嵌套文档的替代方案,性能较差但更灵活。父母和孩子确实可以独立,您可以检索孩子查询父母或父母查询孩子。

我不确定父母/孩子是否会对您的情况有所帮助,特别是如果您的问题只是返回匹配的孩子。

于 2013-07-12T09:37:06.670 回答
1

可能有点晚了,但我[object mapping [...] can't be changed from non-nested to nested]在“嵌套”映射字段上遇到了同样的问题,我通过将映射设置为“对象”解决了这个问题。

带有 springdata 注释的示例:

@Field(type = FieldType.Object)
List<Component> components;
于 2015-02-11T17:08:12.670 回答