对对象数组进行过滤

M22*_*2an 3 arrays elasticsearch

在elasticsearch中,我们有一个包含对象数组的类型。当尝试从 Kibana 访问时,我在访问时遇到一些不一致的情况

这是我的映射的摘录,

{
    "myIndex-2017.08.22": {
        "mappings": {
            "typeA": {
                "properties": {
                    .
                    .
                    .
                    "Collection": {
                        "properties": {
                            .
                            .
                            .
                            "FileType": {
                                "type": "text"
                            }
                        }
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我可以在集合中有多个对象,即,将其索引为数组。当我尝试使用一种文件类型(例如 FileType: DOCX)进行查询时,我也会得到一些文件类型为 HTML 的记录。

当深入查看时,我发现这是因为某些记录有两个集合元素,一个是 FileType:DOCX,另一个是 FileType:HTML。

为什么过滤会这样工作?是否有其他方法可以过滤并仅获取 FileType: DOCX 而不是显示 FileType: HTML。

我正在运行 ES 5.3。

Mar*_*lze 6

Elasticsearch 开箱即用地展平数组字段,因此

{
 "files" : [ 
    {
      "name" : "name1",
      "fileType" :  "doc"
    },
    {
      "name" : "name2",
      "fileType" :  "html"
    }
  ]}
Run Code Online (Sandbox Code Playgroud)

变成:

{
  "files.name" : [ "name1", "name2" ],
  "files.fileType" :  [ "doc", "html" ]
}
Run Code Online (Sandbox Code Playgroud)

如果您想在此数组中搜索对象本身,则必须在集合的映射中使用嵌套数据类型:

{
    "myIndex-2017.08.22": {
        "mappings": {
            "typeA": {
                "properties": {
                    .
                    .
                    .
                    "Collection": {
                        "type": "nested",
                        "properties": {
                            .
                            .
                            .
                            "FileType": {
                                "type": "text"
                            }
                        }
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)