2013-07-11 54 views
0

我有一個很大的JSON與包含數組的許多字段。說一個字段是「Top」,其中包含許多字段:「Middle1」,「Middle2」,「Middle3」。這些「中間」字段中的每一個都包含一個數組。是否有任何簡單的方法只搜索Middle1中的每個元素並返回單個元素?當我在帶有匹配的查詢中嘗試「Middle1.description」:「blahblahblah」時,elasticsearch返回所有Middle1。我也嘗試通過elasticsearch更改默認映射嵌套,它告訴我:Elasticsearch:處理與數組JSONs

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

我在這裏虧本。

而且,如果ES可以通過所有這些陣列的搜索和返回匹配的各個元素,那將是非常美妙的。

回答

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-nested-documents/

正如文章提到父/子是替代嵌套的文件,少高性能但更靈活。父母和孩子可以確實是獨立的,你可以檢索詢問父母的孩子或父母詢問孩子。

我不知道但如果父/子將是有幫助的,你的情況,特別是如果你的問題是隻返回匹配的兒童。

0

可能有點晚,但我遇到了同樣的問題[object mapping [...] can't be changed from non-nested to nested]上的「嵌套」映射的字段,那我已經通過設置映射到‘對象’解決。

實施例與springdata註釋:

@Field(type = FieldType.Object) 
List<Component> components;