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.CustomerCompany
、CustomerInfo.CustomerEmail
、CustomerInfo.SubmissionDate
。所以你可以使用 "script" : "doc['CustomerInfo.CustomerCompany'].size() > 2"
我在 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.CustomerCompany
、CustomerInfo.CustomerEmail
、CustomerInfo.SubmissionDate
。所以你可以使用 "script" : "doc['CustomerInfo.CustomerCompany'].size() > 2"