过滤对象数组

时间:2017-08-23 06:49:13

标签: arrays elasticsearch

在elasticsearch中,我们有一个具有对象数组的类型。当试图从Kibana访问时,我在访问

时遇到了一些不一致

以下是我的映射摘录

{
    "myIndex-2017.08.22": {
        "mappings": {
            "typeA": {
                "properties": {
                    .
                    .
                    .
                    "Collection": {
                        "properties": {
                            .
                            .
                            .
                            "FileType": {
                                "type": "text"
                            }
                        }
                    }
                }
            }
        }
    }
}

这里我可以在Collection中有多个对象,即将其索引为数组。当我尝试使用一个FileType进行查询时,例如FileType:DOCX,然后我得到一些FileType为HTML的记录。

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

为什么过滤工作方式如此?是否有任何其他方法可以过滤并仅获取FileType:DOCX并且不显示FileType:HTML。

正在运行ES 5.3。

1 个答案:

答案 0 :(得分:3)

Elasticsearch将数组字段开箱即用,所以

{
 "files" : [ 
    {
      "name" : "name1",
      "fileType" :  "doc"
    },
    {
      "name" : "name2",
      "fileType" :  "html"
    }
  ]}

变为:

{
  "files.name" : [ "name1", "name2" ],
  "files.fileType" :  [ "doc", "html" ]
}

如果要在此数组中搜索对象本身,则必须在集合的映射中使用nested datatype

{
    "myIndex-2017.08.22": {
        "mappings": {
            "typeA": {
                "properties": {
                    .
                    .
                    .
                    "Collection": {
                        "type": "nested",
                        "properties": {
                            .
                            .
                            .
                            "FileType": {
                                "type": "text"
                            }
                        }
                    }
                }
            }
        }
    }
}