Elasticsearch按数组字段大小过滤

时间:2015-12-29 10:54:54

标签: mongodb elasticsearch elasticsearch-mongo-river

我在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问题,我尝试了这个弹性搜索查询:

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

导致此错误:

  

嵌套:GroovyScriptExecutionException [ElasticsearchIllegalArgumentException [在使用types []]的映射中找不到[CustomerInfo]的字段];

使用_source代替doc会得到正确的结果,但速度很慢。

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

是否有其他方法可以根据数组字段大小过滤结果? 我不想创建一个拥有众多客户的新领域。

MongoDB:3.0.7

ElasticSearch:1.4.2

Elasticsearch-River-Plugin:2.0.9

1 个答案:

答案 0 :(得分:2)

朗讯中不存在字段@/usr/bin/python /path/to/your/kivy/main.py ,现有的字段为CustomerInfoCustomerInfo.CustomerCompanyCustomerInfo.CustomerEmail。所以你可以使用CustomerInfo.SubmissionDate