【问题标题】:Elasticsearch filtering by array field sizeElasticsearch 按数组字段大小过滤
【发布时间】:2016-04-03 05:55:09
【问题描述】:

我在 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[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-Plugin:2.0.9

【问题讨论】:

    标签: mongodb elasticsearch elasticsearch-mongo-river


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-23
      • 2014-11-17
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多