在弹性搜索中使用内部对象与否?

时间:2014-05-13 16:05:00

标签: elasticsearch

是否有特定的建议为什么或为什么不在弹性搜索的映射结构中使用内部对象。

我们应该在JSON中使用(因此也可以在映射和查询中使用):

"author":{
    "id":"12345679",
    "firstName":"John",
    "lastName":"Doe"
 }

OR

"authorId":"12345679",
"authorFirstName":"John",
"authorLastName":"Doe"

我知道我们可以同时使用这两种方法,但在分析,索引,搜索方面是否存在任何差异?

欢迎所有反馈!

1 个答案:

答案 0 :(得分:0)

在引擎盖下,内部对象被展平为与其根对象相同的Lucene文档。这与嵌套映射形成对比,后者在Lucene中被视为相关但独立的文档。当您有两个具有相同属性名称的不同子对象时,这很重要...

假设您有一个带有作者和编辑器的书籍对象,每个对象都有一个名字......对于一个子对象,搜索firstName:Bob AND lastName:Smith将返回一本书的作者鲍勃琼斯和乔史密斯的编辑。使用嵌套类型,您将无法匹配这些文档。

所以,在大多数情况下,展平你的文档结构都会有效(无论如何,这都是在幕后做的,所以没有太大区别)。您只需要注意,如果您需要更多语义,“嵌套”也是一个选项 - 即在所有lastName字段中搜索smith。