Elasticsearch 按数组字段大小过滤

Elasticsearch filtering by array field size

我在 MongoDB 中有一个集合,其结构如下:

[
    {
        "Name" : "A",
        "CustomerInfo" : [ 
            {
                "CustomerCompany" : "abc",
                "CustomerEmail" : "user1@abc.com",
                "SubmissionDate" : 1415070090
            }, 
            {
                "CustomerCompany" : "xyz",
                "CustomerEmail" : "user2@xyz.com",
                "SubmissionDate" : 1438820000
            }
        ]
    },
    {
        "Name" : "B",
    },
    {
        "Name" : "C",
        "CustomerInfo" : [ 
            {
                "CustomerCompany" : "mno",
                "CustomerEmail" : "user3@mno.com",
                "SubmissionDate" : 1412590000
            }
        ]
    }
    ...
]

我使用 Elasticsearch-river-plugin

在 elasticsearch 中为这个集合创建了一条河流
curl -XPUT 'http://localhost:9200/_river/product_custinfo/_meta' -d '{
  "index": {
    "name": "CustomerInfo",
    "type": "CustomerInfo"
  },
  "mongodb": {
    "db": "MyDB",
    "collection": "CustInfo"
  },
  "type": "mongodb"
}'

河流创建的地图:

"CustomerInfo" : {
    "properties" : {
        "CustomerCompany" : {
            "type" : "string"
        },
        "CustomerEmail" : {
            "type" : "string"
        },
        "SubmissionDate" : {
            "type" : "long"
        }
    }
}

现在我想查询超过2个客户的文档。 (注意:可以是任意值)。 我能够使用以下查询在 MongoDB 中获得结果:

db.CustInfo.find({'$where' : 'this.CustomerInfo.length > 2'})

基于 this 问题,我尝试了这个 elasticsearch 查询:

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [
                        {"exists" : {
                            "field" : "CustomerInfo"
                            }
                        },
                        {"script" : {
                            "script" : "doc['CustomerInfo'].size() > 2"
                            }
                        }
                    ]
                }
            }
        }
    }
}

导致此错误:

nested: GroovyScriptExecutionException[ElasticsearchIllegalArgumentException[No field found for [CustomerInfo] in mapping with types []]];

使用 _source 而不是 doc 可以得到正确的结果,但是速度很慢。

"script" : {
    "script" : "_source.CustomerInfo.size() > 2"
}

是否有另一种方法可以根据数组字段大小过滤结果? 我不想创建一个包含客户数量的新字段。


MongoDB : 3.0.7

弹性搜索:1.4.2

Elasticsearch-River-插件:2.0.9

朗讯不存在字段CustomerInfo,存在的字段有CustomerInfo.CustomerCompanyCustomerInfo.CustomerEmailCustomerInfo.SubmissionDate。所以你可以使用 "script" : "doc['CustomerInfo.CustomerCompany'].size() > 2"